繁体   English   中英

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

[英]JS array concatenation for results of recursive flattening

美好的一天!

任务是获取数组的平面版本,其中可能包含一定数量的嵌套数组以及其他元素。 对于输入[1, [2], [3, [[4]]]] [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 添加nestedElements (据说存储递归调用的返回结果)时,出了什么问题。 如果我们首先使用以下代码段更改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函数,该函数会将返回的数组添加到结果中,但由于某种原因,情况并非如此。 关于这个任务的问题被问到了,就像这个一样,但是那些与展平算法部分有关的问题,这里不问了。 我仍然看不到究竟是什么导致了差异的答案。 这很可能是我在麻烦中或由于我有限的经验而忽略的东西。 对不起,如果是这样的话。

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

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

所以你需要分配结果:

result = result.concat(nestedElements);
// ^^^^^^ assignment

我对接受的答案感到困惑,因为它只能连接两个数组。 你想要的嵌套数组实际上是:

var flatArray = [].concat.apply([], yourNestedArray);

这是我的功能。

   function _recursive_array_flat( ...args )
   {
       var _ret_array = [];
       for( _arg of args )
       {
           if ( _arg instanceof Array )
           {
               if ( _arg.length > 0 ) // work with consistent elements only
               _ret_array = _ret_array.concat( _recursive_array_flat( ..._arg ) );
           }
           else _ret_array.push( _arg );
       }

       return _ret_array;
    }

    var _ret = _recursive_array_flat( [0], 1,2,3, [ 4,5,6, [ 7,8,9 ] ] );
    console.log( _ret );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM