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 July 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 Language Specification # sec-array.prototype.reduceright |
Совместимость с браузерами
BCD tables only load in the browser