23日目-2: Javascript で map とか
こんばんは。Tosh でございます。
今回はなんとなしに遊んでみたことを残してみようかと。
Javascript で map とか
事前準備
どうやら Javascript には range がないようなので、下記サイトを参考に range 関数を定義しておきます。
jsでrange関数をつくる - Qiita
map(写像)
配列の要素それぞれに関数を適用する、おなじみのアレです。
フィボナッチ数列を例としてやってみます。
var fib = n => n < 2 ? 1 : fib(n - 1) + fib(n - 2);
range(10).map(fib);
実行結果はこんな感じです。
filter(抽出)
読んで字のごとく、です。
偶数のみ抽出する処理を例としてやってみます。
range(10).filter(n => n % 2 === 0);
実行結果はこんな感じです。
reduce(畳み込み)
配列の要素を左から右へ適用して、1つの値に合体(?)する、こちらも割とおなじみかと。
階乗を例としてやってみます。
range(5).map(n => n + 1).reduce(fact);
実行結果はこんな感じです。
ちなみに、これの亜種で右から左へ畳み込むのが reduceRight だったりします。
しかし順序を考慮しなければならないケースといえば……
['a', 'b', 'c', 'd', 'e'].reduceRight((ac, cur) => ac + cur);
……なんかもっとマシなのなかったの?orz
flatMap(持ち上げ?)
これに関してはうまく説明できない(というか理解が怪しい)のですが、多重配列を平坦化した上で写像を行う、という認識です。
モナドを適用している値に関数を適用する bind と似たような感じですかね?
var fib = n => n < 2 ? 1 : fib(n - 1) + fib(n - 2); [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]].flatMap(fib); => (10) [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
……となる想定なんですが、実験的な機能のため、どのブラウザでも動作しないようですorz
適当に遊んだだけの記事ですが、今日はこの辺で。