我正在研究免费代码阵营的压路机问题。我想出了两个解决方案:一个完美地工作[1,2,3,4],但另一个是[4]。
该问题要求编写一个扁平化任何类型数组的函数。
我的工作代码:
function steamrollArray(arr) {
newArr = [];
for (i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i]) === true) {
newArr = newArr.concat(steamrollArray(arr[i]));
} else if (Array.isArray(arr[i]) === false) {
newArr.push(arr[i]);
}
}
return newArr;
}
steamrollArray([1, [2], [3, [[4]]]]);
我没有工作的代码:
function steamrollArray(arr) {
newArr = [];
for (i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i]) === true) {
newArr.push(steamrollArray(arr[i]));
} else if (Array.isArray(arr[i]) === false) {
newArr.push(arr[i]);
}
}
return newArr;
}
steamrollArray([1, [2], [3, [[4]]]]);
有谁可以解释为什么第二个代码只给出[4]?
答案 0 :(得分:1)
这是因为在第一个代码中,您正在使用
newArr = newArr.concat()
,您将其分配给本地变量。因此,即使在递归中,也会存储状态。
但是在第二段代码中,您正在使用newArr.push()
,并且在递归中,您再次声明newArr=[]
;
这就是问题所在。
答案 1 :(得分:0)
function steamrollArray(arr) {
// I'm a steamroller, baby
let newArr = arr.slice(); //newArr is a copy of arr
var result = []; //this is going to be the flatted array
checkArray(newArr, result);
return result;
}
function checkArray(myArray, resultedArray) {
//this function is a a recursion
return myArray.map(elt => {
if (!Array.isArray(elt)) {
//so this is a simple element, it is not an array, lets push it
resultedArray.push(elt);
return elt;
} else {
return checkArray(elt, resultedArray);
}
});
}
console.log(steamrollArray([1, {},
[3, [
[4]
]]
])); // should return [1, {}, 3, 4].
代码中的注释很有帮助