2017-02-10 47 views
0

我在写一个递归函数,它需要一个嵌套数组的数组并将所有值放入一个数组中。现在它有时会起作用,但有时它不起作用。关于recusive函数的困惑

function steamrollArray(arr) { 
 
    var newArr = []; 
 
    
 
    var func = function(array){ 
 
     for(i=0; i<array.length; i++){ 
 
     if(Array.isArray(array[i])){ 
 
      func(array[i]); 
 
     } 
 
     else { 
 
      newArr.push(array[i]); 
 
     } 
 
     } 
 
    }; 
 
    
 
    func(arr); 
 
    return newArr; 
 
}

当我运行steamrollArray([1, [2], [3, [[4]]]])它的工作原理,但如果我跑steamrollArray([[1], [[2]], [3, [[4]]]]);它不包括2出于某种原因,如果我跑我的steamrollArray([1, [], [3, [[4]]]])浏览器崩溃。感谢您提供的任何见解!

+0

我建议写入控制台并查看它崩溃的位置。你试过了吗? – Forklift

+0

我做了第一个和第二个例子。第一个完成所有的事情,第二个例子看起来像一切都会起作用,但由于某种原因,它会跳过第二个循环。我甚至没有把浏览器崩溃的问题搞砸了。 – Alex

回答

3

你的问题是i是在全球范围内,你需要声明它的地方,所以加let i

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

 
console.log(steamrollArray([[1], [[2]], [3, [[4]]]])); 
 
console.log(steamrollArray([1, [], [3, [[4]]]]));

否则你打电话每次函数i增加,你可以脱离债券(就像在你的最后一个例子中)或跳过一些元素(如第二个例子中所示)

+1

非常感谢!我认为它必须这样做,但我不明白为什么它会像一个全局变量。使用'let'和'var'有什么不同? – Alex

+0

没关系,我Google搜索了!再次感谢! – Alex

+2

[let'和'var'之间的区别](http://stackoverflow.com/questions/762011/whats-the-difference-between-using-let-and-var-to-declare-a-variable)。在这种情况下:没有有效的区别。 – GolezTrol