2016-09-02 5 views
3

おはよう!再帰的平坦化の結果のJS配列の連結

タスクには、フラットなバージョンの配列を取得することがあります。これには、ネストされた配列やその他の要素がいくらか含まれている可能性があります。入力の場合[1, [2], [3, [[4]]]]出力[1, 2, 3, 4]が必要です。 FreeCodeCamp Spoilerアラート。 は当然のことながら、再帰的な解決策は

function steamrollArray(arr) { 
    var result = []; 
    for(var i = 0; i < arr.length; i++){ 
     //part of interest 
     if (Array.isArray(arr[i])){ 
     var nestedElements = steamrollArray(arr[i]); 
     for(var j = 0; j < nestedElements.length; j ++){ 
      result.push(nestedElements[j]); 
     } 
     //</part of interest>. 
     } else { 
     console.log("pushing: " + arr[i]); 
     result.push(arr[i]); 
     } 
    } 
    return result; 
} 

:例えば、心に来て、それはそれはことだし。サンプル実行の結果は次のようになります。

pushing: 1 
pushing: 2 
pushing: 3 
pushing: 4 
[1, 2, 3, 4] 

そして質問です:ゆがんで何が起こるのか、我々はnestedElements(再帰呼び出しのはずの店舗リターン結果という)を追加する連結を使用する場合。私たちは以下のスニペットで(関心の一環としてマーク)forループで最初のif{}のブロックを変更している場合:私の理解では、結果を渡すことだった

pushing: 1 
pushing: 2 
pushing: 3 
pushing: 4 
[1] 

if (Array.isArray(arr[i])){ 
    var nestedElements = steamrollArray(arr[i]); 
    result.concat(nestedElements); 
} else { 

我々は次の結果を観察しますconcat関数への各再帰呼び出しのうち、返された配列を結果に追加しますが、何らかの理由でそうではありません。 this oneのようにこのタスクに関する質問がありましたが、ここでは疑問のない平坦化アルゴリズムの部分に関係する質問がありました。 私はまだ正確にその違いを引き起こす答えを見ることができません。それは、私が面倒で見過ごした、あるいは私の限られた経験の結果として非常にうまくいくかもしれません。申し訳ありませんが、その場合です。

+2

Array.concatは、新しい配列を作成し、それに要素を追加して結果を新しい配列にします。 Array.concatは不変ですが、Array.pushは変更可能です。 concat操作の結果をnestedElementsに再度格納する必要があります。 –

+0

私のレッスンは、私が使用しているツールの仕様を二重チェックすることです。特に、コードの正確な行が予期しない動作を引き起こすことが明らかな場合は特にそうです。 ご協力いただきありがとうございます! – shimey

答えて

4

Array#concatは結果とともに新しい配列を返します。

concat()方法は、それを引数として提供配列(単数または複数)および/または値(S)と結合呼び出された配列からなる新規の配列を返します。

だから、結果を代入する必要があります。

result = result.concat(nestedElements); 
// ^^^^^^ assignment 
1

それは2つのだけの配列CONCATすることができますように私は受け入れ答えで困惑しています。ネストされた配列に必要なものは、実際には次のとおりです。

var flatArray = [].concat.apply([], yourNestedArray);