展平JavaScript数组 - 为什么这不起作用?

时间:2017-03-12 04:20:34

标签: javascript

我正在尝试使用随机嵌套数组来压缩数组。我不确定为什么我写的函数会以无限循环结束:

let array = [1, 2, [3]]
var final_array = [] 

function flattener(array){
  for(i = 0; i < array.length; i++){
    if(array[i] instanceof Array){
      flattener(array[i])
    }else{
      final_array.push(array[i])
    }
  }
}

flattener(array)

我认为应该发生的是:

当我在[3]的for循环检查中时,它进入if语句,再次调用flattener,它结算,然后退出if语句。

相反,if语句一直调用无限地检查[3],我不确定为什么会这样。

4 个答案:

答案 0 :(得分:8)

问题是您没有声明i变量,因此它会泄漏到全局空间并在递归时被重置。

变化:

for(i = 0; i < array.length; i++){

要:

for(var i = 0; i < array.length; i++){

答案 1 :(得分:2)

这是另一种使用Array.reduceArray.concat的方法。

/**
 * Flattens an array of arrays into one-dimensional array
 * @param  {Array} arr: the array to be flattened
 * @return {Array}
 */
function flatten(arr) {
  return arr.reduce(function (flattened, cvalue) {
    return flattened.concat(Array.isArray(cvalue) ? flatten(cvalue) : cvalue);
  }, []); // initial value of flattened array []
}

测试它......

let array = [1, 2, [3]]
var falttened = flatten(array)

看看他的要点:Array flatten

答案 2 :(得分:2)

Array#concatArray#map 另一种方式你可以实现这个

var flattener = arr => [].concat.apply([], arr.map(item=>Array.isArray(item) ? flattener(item) : item));

或ES5版本

var flattener = function flattener(arr) {
  return [].concat.apply([], arr.map(function (item) {
    return Array.isArray(item) ? flattener(item) : item;
  }));
};

答案 3 :(得分:1)

更改

 for(i = 0; i < array.length; i++)

 for(var i = 0; i < array.length; i++)