(JS)reduce

悲しいことに配列のreduceを使う時に混乱することがままあります. ガンバレということで記しておきます.

reduceの定義

Array.prototype.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しているモノです.初回だけは異なることを注意すべきです.

811PJtVqA3L