6.8 KiB
6.8 KiB
title | localeTitle |
---|---|
Steamroller | 压路机 |
如果卡住,请记得使用**Read-Search-Ask
** 。尝试配对程序并编写自己的代码
问题说明:
这个问题看起来很简单,但你需要确保扁平化任何数组,无论级别是什么,这会给问题增加一些难度。
相关链接
提示:1
您需要检查元素是否是数组。
现在尝试解决问题
提示:2
如果您正在处理数组,那么您需要通过获取数组内的值来展平它。这意味着如果你有[4]然后而不是返回[4]你需要返回4.如果你得到[[[4]]]那么相同,你想要4.你可以用arr [index1]访问它[index2]更深层次。
现在尝试解决问题
![:speech_balloon:提示:3
您肯定需要递归或其他方式来超越两级数组,以使代码灵活,而不是硬编码到所需的答案。玩的开心!
现在尝试解决问题
扰流警报!
提前解决!
基本代码解决方案
function steamrollArray(arr) {
var flattenedArray = [];
// Create function that adds an element if it is not an array.
// If it is an array, then loops through it and uses recursion on that array.
var flatten = function(arg) {
if (!Array.isArray(arg)) {
flattenedArray.push(arg);
} else {
for (var a in arg) {
flatten(arg[a]);
}
}
};
// Call the function for each element in the array
arr.forEach(flatten);
return flattenedArray;
}
// test here
steamrollArray([1, [2], [3, [[4]]]]);
代码说明:
- 创建一个新变量以保持展平的数组。
- 创建一个将非数组元素添加到新变量的函数,对于那些数组,它循环遍历它们以获取元素。
- 它通过使用递归来实现,如果元素是一个数组,那么再次使用一层数组调用该函数来检查它是否是一个数组。如果不是那么将非数组元素推送到返回的变量。否则,继续深入。
- 调用该函数,第一次总是将它传递给一个数组,因此它总是落入isArray分支
- 返回展平的数组。
相关链接
中级代码解决方案:
function steamrollArray(arr) {
let flat = [].concat(...arr);
return flat.some(Array.isArray) ? steamrollArray(flat) : flat;
}
flattenArray([1, [2], [3, [[4]]]]);
代码说明:
- 使用spread运算符将
arr
每个元素与一个空数组连接起来 - 使用
Array.some()
方法查明新数组是否仍包含数组 - 如果是这样,再次使用递归调用
steamrollArray
,传入新数组以在深度嵌套的数组上重复该过程 - 如果没有,则返回展平的阵列
相关链接
高级代码解决方案
function steamrollArray(arr) {
return arr.toString()
.replace(',,', ',') // "1,2,,3" => "1,2,3"
.split(',') // ['1','2','3']
.map(function(v) {
if (v == '[object Object]') { // bring back empty objects
return {};
} else if (isNaN(v)) { // if not a number (string)
return v;
} else {
return parseInt(v); // if a number in a string, convert it
}
});
}
代码说明:
- 首先,我们将数组转换为一个字符串,它将为我们提供一个由逗号分隔的数字字符串,如果有空数组,则为双逗号;如果有对象,则为文字对象文本,我们稍后可以在if语句中修复它。
- 我们用一个替换双逗号,然后将它分成一个数组。
- 映射数组并修复对象值并将字符串数转换为常规数。