你好!
任务是获取一个扁平化的数组,该数组可能包括一些嵌套数组以及其他元素。对于输入[1, [2], [3, [[4]]]]
,输出[1, 2, 3, 4]
是期望结果。FreeCodeCamp剧透警告。 自然而然地,可以想到使用递归解决,例如:
function steamrollArray(arr) {
var result = [];
for(var i = 0; i < arr.length; i++){
//part of interest
if (Array.isArray(arr[i])){
var nestedElements = steamrollArray(arr[i]);
for(var j = 0; j < nestedElements.length; j ++){
result.push(nestedElements[j]);
}
//</part of interest>.
} else {
console.log("pushing: " + arr[i]);
result.push(arr[i]);
}
}
return result;
}
它会执行它的功能。样本运行的结果如下:
pushing: 1
pushing: 2
pushing: 3
pushing: 4
[1, 2, 3, 4]
问题是:当我们使用concat添加嵌套元素(这些元素应该存储递归调用的返回结果)时,出了什么问题。如果我们要将
for
循环中的第一个if{}
块(标记为感兴趣的部分)更改为以下代码片段:if (Array.isArray(arr[i])){
var nestedElements = steamrollArray(arr[i]);
result.concat(nestedElements);
} else {
我们将观察以下结果:
pushing: 1
pushing: 2
pushing: 3
pushing: 4
[1]
我的理解是将每个递归调用的结果传递给
concat
函数,该函数会将返回的数组添加到结果中,但由于某些原因并非如此。
类似这样的问题已经被问过了,但那些问题关注的是展开算法部分,而不是本文所述的问题。
我仍然无法看出答案,究竟是什么导致了这种差异。这很可能是我在匆忙中或因为我的有限经验而忽略掉的东西。如果是这样,请见谅。