JavaScriptのapplyの黒い使い方
JavaScriptプログラミング、zipもないし(Haskell的な)concatもないし辛い…と思ったらこれの2つ目の奴が魔法っぽくてやばい http://t.co/s1CFkyQyGZ [Sombrero]
— ぽこつん@ (@ponkotuy) 2013, 7月 18
うそだーと思ったら本当になりました。
Haskell的なconcatって?
Haskellのconcatは、n次元のリストをn-1次元にする関数です。(n=2,3,..)
RubyだとArray#flatten(1)ですね。これ、JavaScriptでやろうと思うとこうなるようです。
[].concat.apply([], [[1],[2,3],[4]]) // [ 1, 2, 3, 4 ]
お、おう…
とりあえずまずはapplyの説明から
あまりお目にかかりませんが、JavaScriptのapplyは、当該のメソッドにおけるthisを、引数にとったオブジェクトにしてしまうものです。
function sayName() { return this.Name; } var person = { name: "yuuxx" }; console.log(sayName.apply(person)); // "yuuxx"
みたいな感じで使います。
で、このapply、2つ引数を渡すことができて、その2つ目は関数に渡す値を納めた配列です。
そしてconcatの説明
JavaScriptのarray.concatは、複数の引数を受け取ると、それらを元の配列に連結して返します。
もうお分かりですね。複数の引数を配列で渡すので、結果的に配列の次元がひとつ下がるというわけです。納得するとなんだそれだけのことか、となってしまいそうですがなかなかの編隊挙動です。