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){
// ...
})
関数が呼び出される初回は、 previousValue と currentValue は 2 つの値のうちの 1 つを取り得ます。reduce 呼び出し時に、initialValue が与えられた場合、previousValue は initialValue と等しくなり、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]