递归以展平数组不起作用

时间:2017-06-24 11:10:11

标签: javascript recursion

我正在研究免费代码阵营的压路机问题。我想出了两个解决方案:一个完美地工作[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]?

2 个答案:

答案 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].

代码中的注释很有帮助