展平JavaScript数组——为什么不';这不管用吗?

展平JavaScript数组——为什么不';这不管用吗?,javascript,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(

我试图用随机嵌套的数组展平一个数组。我不确定我编写的函数为什么会以无限循环结束:

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)
let数组=[1,2,3]]
变量final_数组=[]
函数平坦器(阵列){
对于(i=0;i
我认为应该发生的是:

当我在for循环中检查
[3]
时,它进入if语句,再次调用
扁平化器,它解析,然后退出if语句


相反,if语句不断调用以无限次地检查
[3]
,我不知道为什么会发生这种情况。

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

更改:

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

for(变量i=0;i
这是使用和的另一种方法

测试它

let array = [1, 2, [3]]
var falttened = flatten(array)
看看他的要点:

Array#concat
plus
Array#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;
  }));
};
改变

for(i=0;i

for(变量i=0;i
哦,我的上帝。非常感谢你,我爱你。设置断点并逐行运行可能会告诉你出了什么问题。
var flattener = arr => [].concat.apply([], arr.map(item=>Array.isArray(item) ? flattener(item) : item));
var flattener = function flattener(arr) {
  return [].concat.apply([], arr.map(function (item) {
    return Array.isArray(item) ? flattener(item) : item;
  }));
};
 for(i = 0; i < array.length; i++)
 for(var i = 0; i < array.length; i++)