★ wanayoo — archive 1999 http://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Objects/Array/reduceRightNouvelle recherche | Portail wanayoo

Mozilla.com

reduceRight


概要

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

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

構文

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

引数

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

詳細

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

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

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

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

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

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

// 最初の呼び出し
previousValue = 4, currentValue = 3, index = 3

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

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

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

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

// 戻り値: 10

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

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

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

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

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

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

// 5 回目の呼び出し
previousValue = 20, currentValue = 0, index = 0

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

// 戻り値: 20

互換性

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

if (!Array.prototype.reduceRight)
{
  Array.prototype.reduceRight = 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 = len - 1;
    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 >= 0; i--)
    {
      if (i in this)
        rv = fun.call(null, rv, this[i], i, this);
    }

    return rv;
  };
}

例: 配列内の値を全て足す

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

例: 多次元配列を 1 次元配列にする

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

参照

reduce




このページは2008年 1月 3日, 13:10に更新されました by Mgjbot

タグ:

ファイル (0)