(JS)reduce
悲しいことに配列のreduceを使う時に混乱することがままあります. ガンバレということで記しておきます.
reduceの定義
MDNによると次のように定義されています.
[概要] 隣り合う 2 つの配列要素に対して(左から右へ)同時に関数を適用し、単一の値にします。 [構文] var result = array.reduce(callback[, initialValue]); [引数] - callback 4 つの引数を取って、配列内の各値に対し実行するコールバック関数 - previousValue 現在処理されている配列要素の 1 つ前の要素。もしくは、initialValue。 initialValue については、後で述べます。 - currentValue 現在処理されている配列要素 - index 現在処理されている配列要素のインデックス - array reduce に呼ばれた配列 - initialValue callback の最初の呼び出しのときに、最初の実引数として用いるためのオブジェクト。
用例はこんな感じが多いでしょう.
var result = [1, 2, 3, 4, 5].reduce(
function (sum, value) {
return sum += value;
});
console.log(result); // 15
関数型プログラミングにおいて
まあ,こうやって見ると至極簡単のようです. どうしてこのようなエントリを書くとなったかというと,今,関数型プログラミングを勉強しているからです.それに則ってプログラムするとこんな感じでしょうか.
var values = [3, 2, 4, 5, 1];
var functions = [
Array.prototype.sort,
Array.prototype.reverse
];
var result = functions.reduce(
function (v, f) {
return f.call(v);
},
values);
console.log(result); // [5, 4, 3, 2, 1]
reduceの2つ目の引数であるinitialValueはオプションですが,つけるとわかりやすくなります. reduceが配列から取り出してくる要素はあくまでfに入ります.vはcallbackがreturnしているモノです.初回だけは異なることを注意すべきです.