2017-05-25 10 views
1

配列を平坦化するための単純な再帰的なアプローチに取り組んでいます。私はこれ(How to flatten nested array in javascript?)上の他のスレッドを見てきましたが、私は.concatや.reduceを使わないとやりたいと思っています。JavaScriptで.concatまたは.reduceを使用しないネストされた配列への再帰的アプローチ

このループはループを維持しますが、最もネストされた配列をヒットし、その中の文字を返すように見える理由はわかりません。

ありがとうございます!

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

アンドリューがやった! forループで 'var'を追加するとRJMのコメントは真実ではないと思います。皆さんありがとう!ヘルプをよろしくお願いします。 – skdfsdfa

+0

@skdfsdfa、RJMは問題の説明で正しいです。彼らはあなたのコードが無限ループを引き起こしている理由を理由に、より多くのコンテキストを追加しようとしていました。 – Andrew

関連する問題