修复一个递归函数,该函数使用包含其他数组的元素的数组。它生成一个没有其他数组作为元素的数组

时间:2017-03-01 04:41:31

标签: javascript recursion

第一次发帖。抱歉格式不正确。我想让我的功能发挥作用。当前的问题是,一旦为第一个数组元素调用递归函数,递归就会停止。我需要它在调用数组后继续运行。

TLDR:我想要压扁数组。

function steamrollArray(arr) {
   var newArr=[];
   //return Array.isArray(arr[2]);

   //takes an array of which some elements will also be arrays and pushes its non-array elements to a new array (newArr)
   function recurseArr(a){
      for (i=0; i<a.length; i++){
         //recursion where you take the array element (also an array) and apply the same function until you get an element
         if(Array.isArray(a[i])){
            //&& i==a.length
            recurseArr(a[i]);
         }
         //case where the original array element is not an array but an element already
         else{
            newArr.push(a[i]);
         }
      }
   }
   //end of recurseArr

  recurseArr(arr);
  return newArr;
}

steamrollArray([1, 2, [2, 3], 2, [[[4]]]]);

期望的输出:[1,2,2,3,2,4]

2 个答案:

答案 0 :(得分:1)

你有两个问题。

  1. 您正在混合两种输出方式。一方面,看起来你的函数返回值。但另一方面,看起来最终输出应该来自newArr。事实上,代码大部分是正确编写的,但你需要坚持使用newArr范例并停止尝试从内部函数返回。

    修复如下:

    if(Array.isArray(a[i])){
       //&& i==a.length
       recurseArr(a[i]); // get rid of `return`
    }
    

    和此:

    return newArr; // remove this
    

    和此:

    // return recurseArr(arr); // don't do this
    recurseArr(arr);
    return newArr;
    
  2. 您不能使用ivar声明您的计数器变量let。这意味着它没有功能范围但实际上是全局范围的成员,例如浏览器中的window或Node中的其他内容,因此您正在修改相同的实例每个循环中i(就好像你在外部函数之前声明了var i一样。)

  3. 现在进行这两项更改(删除注释以便于理解):

    function steamrollArray(arr) {
       let newArr = [];
    
       function recurseArr(a) {
          for (let i = 0; i < a.length; i += 1) {
             if (Array.isArray(a[i])) {
                recurseArr(a[i]);
             }
             else {
                newArr.push(a[i]);
             }
          }
       }
       recurseArr(arr);
       return newArr;
    }
    

    完美无缺。

答案 1 :(得分:0)

主要问题在于循环内部的return语句。 The return statement exits your for loop

如果您的主要目的是展平数组,最好使用像lodashramda这样的实用程序库,其中展平只是:

R.flatten([1, 2, [2, 3], 2, [[[4]]]])