2017-05-25 34 views
1

我正在研究一種簡單的遞歸方法來平坦化數組,我無法弄清楚我要去哪裏錯了。我看過其他線程(How to flatten nested array in javascript?),但我試圖做到這一點,而不使用.concat或.reduce。嵌套數組的遞歸方法,而不使用.concat或.reduce在JavaScript中

這一個不斷循環,但我不知道爲什麼 - 它看起來應該擊中最嵌套的數組並返回其中的任何字符。

謝謝!

var ret= []; 
var nested = [['a','b'],[],'c',['d','e']]; 
function flatten(arr) { 
    for (i = 0; i < arr.length; i++) { 
    if (Array.isArray(arr[i])) { 
     flatten(arr[i]); 
    } else { 
     ret.push(arr[i]); 
    } 
    } 
} 
flatten(nested); 

回答

3

您忘記聲明i作爲變量。它被視爲一個全球變量。

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

如果輸出的i值在每次迭代中,你會看到你的無限循環的問題,

0, 1, 3, 0, 1, 3, 0, 1, ... 
+0

這只是說明了問題的一部分。遞歸導致稍後調用'flatten'來重用相同的全局變量並覆蓋其中的值,而外部調用中的循環仍處於迭代中。 – RJM

+0

安德魯做到了!我不認爲RJM的評論是真實的,因爲它在for循環中增加了'var'。謝謝大家!感謝幫助 – skdfsdfa

+0

@skdfsdfa,RJM在他們對問題的解釋中是正確的。他們試圖添加更多的上下文,理由是**爲什麼**代碼導致無限循環。 – Andrew