JS数组串联递归展平的结果

shi*_*mey 5 javascript arrays recursion concat flatten

美好的一天!

任务是获得一个数组的平面版本,可能包括一些嵌套数组以及其他元素.用于预期的输入[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;
}
Run Code Online (Sandbox Code Playgroud)

它确实是这样的.样本运行的结果将是:

pushing: 1
pushing: 2
pushing: 3
pushing: 4
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

问题是:当我们使用concat添加nestedElements(假设存储递归调用的返回结果)时会出现什么问题.如果我们要使用下面的代码段更改循环中的第一个if{}for(标记为感兴趣的一部分):

if (Array.isArray(arr[i])){
    var nestedElements = steamrollArray(arr[i]);
    result.concat(nestedElements);
} else {
Run Code Online (Sandbox Code Playgroud)

我们将观察以下结果:

pushing: 1
pushing: 2
pushing: 3
pushing: 4
[1]
Run Code Online (Sandbox Code Playgroud)

我的理解是将每个递归调用的结果传递给concat函数,该函数将返回的数组添加到结果中,但由于某种原因,情况并非如此.有人问过这个问题,就像这个问题一样,但那些涉及展平算法部分的问题,这里没有提出质疑.我仍然没有看到答案究竟是什么导致了差异.这很可能是我在麻烦中或由于我有限的经验而忽略的事情.对不起,如果是这样的话.

Nin*_*olz 5

Array#concat 返回带有结果的新数组。

concat()方法返回一个新数组,该数组由调用该数组的数组以及作为参数提供的数组和/或值连接而成。

因此,您需要分配结果:

result = result.concat(nestedElements);
// ^^^^^^ assignment
Run Code Online (Sandbox Code Playgroud)