2017-02-10 88 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