今日の知見

Toshが諸々で得た知見を雑に書きます。

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);

実行結果はこんな感じです。
f:id:tosh_note:20180423224400p:plain

filter(抽出)

読んで字のごとく、です。
偶数のみ抽出する処理を例としてやってみます。

range(10).filter(n => n % 2 === 0);

実行結果はこんな感じです。
f:id:tosh_note:20180423224715p:plain

reduce(畳み込み)

配列の要素を左から右へ適用して、1つの値に合体(?)する、こちらも割とおなじみかと。
階乗を例としてやってみます。

range(5).map(n => n + 1).reduce(fact);

実行結果はこんな感じです。
f:id:tosh_note:20180423225359p:plain

ちなみに、これの亜種で右から左へ畳み込むのが reduceRight だったりします。
しかし順序を考慮しなければならないケースといえば……

['a', 'b', 'c', 'd', 'e'].reduceRight((ac, cur) => ac + cur);

f:id:tosh_note:20180423225812p:plain
……なんかもっとマシなのなかったの?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

適当に遊んだだけの記事ですが、今日はこの辺で。