| ★ wanayoo — archive 1999 http://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight | Nouvelle recherche | Portail wanayoo |
配列の(右から左へ) 2 つの値に対して同時に関数を適用し、単一の値にします。
| Array のメソッド | |
| 実装されたバージョン | JavaScript 1.8 (Gecko 1.9a5 以降) |
| ECMAScript エディション: | 無し |
reduceRight は、配列に存在するおのおのの要素に対して、callback 関数を一度だけ実行します。配列における穴は対象からはずされ、また、4 つの引数を受け取ります。: 初期値(あるいは、直前の callback 呼び出し)、 現在の要素の値、現在のインデックス、そして、繰り返しが行われる配列です。
reduceRight の callback の呼び出しは、以下のように見えるでしょう。:
.reduceRight(function(previousValue, currentValue, index, array){
// ...
})
関数が呼び出される初回は、 previousValue と currentValue は 2 つの値のうちの 1 つを取り得ます。reduce 呼び出し時に、initialValue が与えられた場合、previousValue は initialValue と等しくなり、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;
};
}
このページは2008年 1月 3日, 13:10に更新されました by Mgjbot