Visit Mozilla.org

Core JavaScript 1.5 Reference:Objects:Array:reduce

出典: MDC



目次

[編集] 概要

配列の(左から右へ) 2 つの値に対して同時に関数を適用し、単一の値にします。

Array のメソッド
実装されたバージョン JavaScript 1.8 (Gecko 1.9a5 以降)
ECMAScript エディション: 無し

[編集] 構文

var result = array.reduce(callback[, initialValue]);

[編集] 引数

callback 
配列のおのおのの値に実行する関数。
initialValue 
callback の最初の呼び出しのときに、最初の実引数として用いるためのオブジェクト。

[編集] 詳細

reduce は、配列に存在するおのおのの要素に対して、callback 関数を一度だけ実行します。配列における穴は対象からはずされ、また、4 つの引数を受け取ります。: 初期値(あるいは、直前の callback 呼び出し)、 現在の要素の値、現在のインデックス、そして、繰り返しが行われる配列です。

reduce の callback の呼び出しは、以下のように見えるでしょう。:

.reduce(function(previousValue, currentValue, index, array){
  // ...
})

関数が呼び出される初回は、 previousValuecurrentValue は 2 つの値のうちの 1 つを取り得ます。reduce 呼び出し時に、initialValue が与えられた場合、previousValueinitialValue と等しくなり、currentValue は、配列の最初の値と等しくなります。 initialValue が与えられなかった場合、previousValue は配列の最初の値と等しくなり、currentValue は、2 番目の値と等しくなります。

関数の実行を追った様子の例は、以下のようになるでしょう。:

[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array){
  return previousValue + currentValue;
});

// 最初の呼び出し
previousValue = 0, currentValue = 1, index = 1

// 2 回目の呼び出し
previousValue = 1, currentValue = 2, index = 2

// 3 回目の呼び出し
previousValue = 3, currentValue = 3, index = 3

// 4 回目の呼び出
previousValue = 6, currentValue = 4, index = 4

// array は、常に、reduce が呼び出された [0,1,2,3,4] というオブジェクトです。

// 戻り値: 10

initialValue を与えた場合、その結果は、以下のようになるでしょう。:

[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array){
  return previousValue + currentValue;
}, 10);

// 最初の呼び出し
previousValue = 10, currentValue = 0, index = 0

// 2 回目の呼び出し
previousValue = 10, currentValue = 1, index = 1

// 3 回目の呼び出し
previousValue = 11, currentValue = 2, index = 2

// 4 回目の呼び出し
previousValue = 13, currentValue = 3, index = 3

// 5 回目の呼び出し
previousValue = 16, currentValue = 4, index = 4

// array は、常に、reduce が呼び出された [0,1,2,3,4] というオブジェクトです。

// 戻り値: 20

[編集] 互換性

reduce は、 ECMA-262 標準に対する JavaScript 拡張です。つまり、このようなものは、他の標準の実装には存在しないかもしれません。 そのような場合、以下のコードをあなたのスクリプトの最初に挿入することにより、これを動作させることができます。このアルゴリズムは、実際に、Firefox と SpiderMonkey で使われたものです。

if (!Array.prototype.reduce)
{
  Array.prototype.reduce = function(fun /*, initial*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    // 初期値がない場合と空配列の場合は値を返さない
    if (len == 0 && arguments.length == 1)
      throw new TypeError();

    var i = 0;
    if (arguments.length >= 2)
    {
      var rv = arguments[1];
    }
    else
    {
      do
      {
        if (i in this)
        {
          rv = this[i++];
          break;
        }

        // 配列が値を含まない場合、初期値を返さない
        if (++i >= len)
          throw new TypeError();
      }
      while (true);
    }

    for (; i < len; i++)
    {
      if (i in this)
        rv = fun.call(null, rv, this[i], i, this);
    }

    return rv;
  };
}

[編集]

[編集] 例: 配列内の値を全て足す

var total = [0, 1, 2, 3].reduce(function(a, b){ return a + b; });
// total == 6

[編集] 例: 多次元配列を 1 次元配列にする

var flattened = [[0,1], [2,3], [4,5]].reduce(function(a,b) {
  return a.concat(b);
}, []);
// flattened is [0, 1, 2, 3, 4, 5]

[編集] 参照

reduceRight