Array.prototype.reduceRight()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since иÑÐ»Ñ 2015 г..
Сводка
ÐеÑод reduceRight() пÑименÑÐµÑ ÑÑнкÑÐ¸Ñ Ðº аккÑмÑлÑÑоÑÑ Ð¸ ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¼Ð°ÑÑива (ÑпÑава-налево), ÑÐ²Ð¾Ð´Ñ ÐµÐ³Ð¾ к Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑениÑ.
СинÑакÑиÑ
arr.reduceRight(callback[, initialValue])
ÐаÑамеÑÑÑ
callback-
ФÑнкÑиÑ, вÑполнÑÑÑаÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа маÑÑива, пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑеÑÑÑе аÑгÑменÑа:
previousValue-
ÐнаÑение, возвÑаÑÑнное пÑедÑдÑÑим вÑполнением ÑÑнкÑии
callback, либо знаÑениеinitialValue, еÑли оно пÑедоÑÑавлено (ÑмоÑÑиÑе поÑÑÐ½ÐµÐ½Ð¸Ñ Ð½Ð¸Ð¶Ðµ). currentValue-
ТекÑÑий обÑабаÑÑваемÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива.
index-
ÐÐ½Ð´ÐµÐºÑ ÑекÑÑего обÑабаÑÑваемого ÑлеменÑа маÑÑива.
array-
ÐаÑÑив, Ð´Ð»Ñ ÐºÐ¾ÑоÑого бÑла вÑзвана ÑÑнкÑиÑ
reduceRight.
initialValue-
ÐеобÑзаÑелÑнÑй паÑамеÑÑ. ÐбÑекÑ, иÑполÑзÑемÑй в каÑеÑÑве пеÑвого аÑгÑменÑа пÑи пеÑвом вÑзове ÑÑнкÑии
callback.
ÐпиÑание
ÐеÑод reduceRight() вÑполнÑÐµÑ ÑÑнкÑÐ¸Ñ callback один Ñаз Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа, пÑиÑÑÑÑÑвÑÑÑего в маÑÑиве, за иÑклÑÑением пÑÑÑоÑ, пÑÐ¸Ð½Ð¸Ð¼Ð°Ñ ÑеÑÑÑе аÑгÑменÑа: наÑалÑное знаÑение (или знаÑение Ð¾Ñ Ð¿ÑедÑдÑÑего вÑзова callback), знаÑение ÑекÑÑего ÑлеменÑа, ÑекÑÑий Ð¸Ð½Ð´ÐµÐºÑ Ð¸ маÑÑив, по коÑоÑÐ¾Ð¼Ñ Ð¿ÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¸ÑеÑаÑиÑ.
ÐÑзов колбÑк-ÑÑнкÑии callback бÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ Ñак:
array.reduceRight(function (previousValue, currentValue, index, array) {
// ...
});
ÐÑи пеÑвом вÑзове ÑÑнкÑии, паÑамеÑÑÑ previousValue и currentValue могÑÑ Ð¿ÑинимаÑÑ Ð¾Ð´Ð½Ð¾ из двÑÑ
знаÑений. ÐÑли пÑи вÑзове reduceRight() пеÑедан аÑгÑÐ¼ÐµÐ½Ñ initialValue, Ñо знаÑение previousValue бÑÐ´ÐµÑ ÑавнÑм знаÑÐµÐ½Ð¸Ñ initialValue, а знаÑение currentValue бÑÐ´ÐµÑ ÑавнÑм поÑÐ»ÐµÐ´Ð½ÐµÐ¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² маÑÑиве. ÐÑли аÑгÑÐ¼ÐµÐ½Ñ initialValue не задан, Ñо знаÑение previousValue бÑÐ´ÐµÑ ÑавнÑм поÑÐ»ÐµÐ´Ð½ÐµÐ¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² маÑÑиве, а знаÑение currentValue бÑÐ´ÐµÑ ÑавнÑм вÑоÑÐ¾Ð¼Ñ Ñ ÐºÐ¾Ð½Ñа знаÑÐµÐ½Ð¸Ñ Ð² маÑÑиве.
ÐÑли маÑÑив пÑÑÑой и аÑгÑÐ¼ÐµÐ½Ñ initialValue не Ñказан, бÑÐ´ÐµÑ Ð±ÑоÑено иÑклÑÑение TypeError. ÐÑли маÑÑив ÑоÑÑÐ¾Ð¸Ñ ÑолÑко из одного ÑлеменÑа (незавиÑимо Ð¾Ñ ÐµÐ³Ð¾ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² маÑÑиве) и аÑгÑÐ¼ÐµÐ½Ñ initialValue не Ñказан, или еÑли аÑгÑÐ¼ÐµÐ½Ñ initialValue Ñказан, но маÑÑив пÑÑÑой, Ñо бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑено одно ÑÑо знаÑение, без вÑзова ÑÑнкÑии callback.
ÐÐ¾Ñ Ñак бÑдÑÑ Ð²ÑглÑдеÑÑ Ð½ÐµÐºÐ¾ÑоÑÑй пÑимеÑÑ Ð¿Ñогона ÑÑнкÑии:
[0, 1, 2, 3, 4].reduceRight(
function (previousValue, currentValue, index, array) {
return previousValue + currentValue;
},
);
ÐолбÑк-ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана ÑеÑÑÑе Ñаза, аÑгÑменÑÑ Ð¸ возвÑаÑаемое знаÑение пÑи каждом вÑзове бÑдÑÑ ÑледÑÑÑими:
previousValue |
currentValue |
index |
array |
возвÑаÑаемое знаÑение | |
|---|---|---|---|---|---|
| пеÑвÑй вÑзов | 4 |
3 |
3 |
[0, 1, 2, 3, 4] |
7 |
| вÑоÑой вÑзов | 7 |
2 |
2 |
[0, 1, 2, 3, 4] |
9 |
| ÑÑеÑий вÑзов | 9 |
1 |
1 |
[0, 1, 2, 3, 4] |
10 |
| ÑеÑвÑÑÑÑй вÑзов | 10 |
0 |
0 |
[0, 1, 2, 3, 4] |
10 |
ÐнаÑение, возвÑаÑÑнное меÑодом reduceRight() бÑÐ´ÐµÑ ÑавнÑм поÑÐ»ÐµÐ´Ð½ÐµÐ¼Ñ ÑезÑлÑÑаÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð»Ð±Ñк-ÑÑнкÑии â 10.
ÐÑли же Ð²Ñ Ð·Ð°Ð´Ð°Ð´Ð¸Ñе наÑалÑное знаÑение initialValue, ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ Ñак:
[0, 1, 2, 3, 4].reduceRight(function (
previousValue,
currentValue,
index,
array,
) {
return previousValue + currentValue;
}, 10);
previousValue |
currentValue |
index |
array |
возвÑаÑаемое знаÑение | |
|---|---|---|---|---|---|
| пеÑвÑй вÑзов | 10 |
4 |
4 |
[0, 1, 2, 3, 4] |
14 |
| вÑоÑой вÑзов | 14 |
3 |
3 |
[0, 1, 2, 3, 4] |
17 |
| ÑÑеÑий вÑзов | 17 |
2 |
2 |
[0, 1, 2, 3, 4] |
19 |
| ÑеÑвÑÑÑÑй вÑзов | 19 |
1 |
1 |
[0, 1, 2, 3, 4] |
20 |
| пÑÑÑй вÑзов | 20 |
0 |
0 |
[0, 1, 2, 3, 4] |
20 |
ÐнаÑение, возвÑаÑÑнное меÑодом reduceRight() на ÑÑÐ¾Ñ Ñаз, конеÑно же, бÑÐ´ÐµÑ ÑавнÑм 20.
ÐÑимеÑÑ
>ÐÑимеÑ: ÑÑммиÑование вÑÐµÑ Ð·Ð½Ð°Ñений в маÑÑиве
var total = [0, 1, 2, 3].reduceRight(function (a, b) {
return a + b;
});
// total == 6
ÐÑимеÑ: ÑазвоÑаÑивание маÑÑива маÑÑивов
var flattened = [
[0, 1],
[2, 3],
[4, 5],
].reduceRight(function (a, b) {
return a.concat(b);
}, []);
// flattened Ñавен [4, 5, 2, 3, 0, 1]
ÐолиÑил
ÐеÑод Array.prototype.reduceRight() бÑл добавлен к ÑÑандаÑÑÑ ECMA-262 в 5-м издании; поÑÑÐ¾Ð¼Ñ Ð¾Ð½ Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑÑÑÑÑвоваÑÑ Ð² дÑÑгиÑ
ÑеализаÑиÑÑ
ÑÑандаÑÑа. ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑабоÑаÑÑ Ñ Ð½Ð¸Ð¼, добавив ÑледÑÑÑий код в наÑало ваÑиÑ
ÑкÑипÑов, он позволÑÐµÑ Ð¸ÑполÑзоваÑÑ reduceRight() в ÑеализаÑиÑÑ
, коÑоÑÑе не поддеÑживаÑÑ ÑÑÐ¾Ñ Ð¼ÐµÑод.
// Шаги алгоÑиÑма ECMA-262, 5-е издание, 15.4.4.22
// СÑÑлка (en): http://es5.github.io/#x15.4.4.22
// СÑÑлка (ru): http://es5.javascript.ru/x15.4.html#x15.4.4.22
if ("function" !== typeof Array.prototype.reduceRight) {
Array.prototype.reduceRight = function (callback /*, initialValue*/) {
"use strict";
if (null === this || "undefined" === typeof this) {
throw new TypeError("Array.prototype.reduce called on null or undefined");
}
if ("function" !== typeof callback) {
throw new TypeError(callback + " is not a function");
}
var t = Object(this),
len = t.length >>> 0,
k = len - 1,
value;
if (arguments.length >= 2) {
value = arguments[1];
} else {
while (k >= 0 && (!k) in t) {
k--;
}
if (k < 0) {
throw new TypeError("Reduce of empty array with no initial value");
}
value = t[k--];
}
for (; k >= 0; k--) {
if (k in t) {
value = callback(value, t[k], k, t);
}
}
return value;
};
}
СпеÑиÑикаÑии
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-array.prototype.reduceright> |