2015-11-09 9 views
7

私はオンラインでいくつかのjavascript演習を行っていました(codewars.com)。 1つの問題は、配列オブジェクトの配列を取得し、配列全体から1つのレベルを削除するようにユーザーに求めました。具体的に「[]」をパラメータとして使用するにはどうすればよいですか?

[] /* becomes */ [] 
[[1, 2, 3], ["a", "b", "c"], [1, 2, 3]] /* becomes */ [1, 2, 3, "a", "b", "c", 1, 2, 3] 
[[3, 4, 5], [[9, 9, 9]], ["a,b,c"]] /* becomes */ [3, 4, 5, [9, 9, 9], "a,b,c"] 

私はconcatメソッドについて学ぶことになったが、最も人気のあるソリューションは、この文を使用し...

function (arr){ 
    return [].concat.apply([],arr); 
} 

誰かがここ[]の使用方法を説明していただけますか?私はこれがどのように正しい結果を生み出すのかを理解することはできません(そしてそれはページ上に説明を与えません)。私は空の括弧がパラメーターとラベル配列として使用される他の多くの時間があることを知っているので、ここでの使用法を理解すれば、将来自分自身でそれを使用できるようになるでしょう。

答えて

7

これを複数の行に分割すると、説明が簡単になります。ラインDの説明は、具体的にあなたの質問

[]   // A 
    .concat // B 
    .apply(// C 
     [], // D 
     arr // E 
    ); 
  • Aアレイですが、ここではそれだけでArray.prototypeへのショートカットとして使用されているので、我々は...
  • Bアクセスすることができ答えるものです我々は次に、
  • と( applyを使用して)呼び出す Array.prototype
  • Cからconcat方法
  • Dthisだから、私たちの前のarr

たベースオブジェクト

  • E引数のリスト、する新しいアレイの引数、あなたは再書き込みこのArray.prototypeを使用した可能性がそしてcallとして書かれたあなたへのより身近になりますどの

    var new_base_arr = []; 
    Array.prototype.concat.call(
        new_base_arr, 
        arr[0], 
        arr[1], 
        ... 
        arr[n] 
    ); 
    

    として

    new_base_arr.concat(arr[0], arr[1], ..., arr[n]); 
    

    ここで解決された問題は、引数の数未定と機能を呼び出しています。

  • +2

    大きな説明!あなたが行ったときに更新して以来、私はいくつかの読みが必要でした。 '[] .concat'と'([、arr) 'の' [] 'が同じ配列オブジェクトであれば、最初から確かに分かりませんでした。 'Array.prototype'と' call'を使って書き直しを続けるあなたの継続は、本当に私にそれを完全に把握させてくれたように、私にはもっとよく知られているように見えます。 – JoeL

    関連する問題