Array.prototype.reduceRight()
Базовая версия Широко доступна
Эта функция хорошо зарекомендовала себя и работает на множестве устройств и версий браузеров. Она доступна во всех браузерах с июля 2015 года.
Метод reduceRight() экземпляров Array применяет функцию к аккумулятору и каждому значению массива (справа налево), чтобы свести его к единственному значению.
См. также Array.prototype.reduce() для обработки слева направо.
Попробовать
const array = [ [0, 1], [2, 3], [4, 5], ]; const result = array.reduceRight((accumulator, currentValue) => accumulator.concat(currentValue), ); console.log(result); // Expected output: Array [4, 5, 2, 3, 0, 1]
Синтаксис
reduceRight(callbackFn) reduceRight(callbackFn, initialValue)
Параметры
-
callbackFn - Функция, которая будет выполняться для каждого элемента массива. Её возвращаемое значение становится значением параметра
accumulatorпри следующем вызовеcallbackFn. При последнем вызове возвращаемое значение становится возвращаемым значениемreduceRight(). Функция вызывается со следующими аргументами:-
accumulator - Значение, полученное в результате предыдущего вызова
callbackFn. При первом вызове его значение равноinitialValue, если последний указан; в противном случае его значение равно последнему элементу массива. -
currentValue - Значение текущего элемента. При первом вызове его значение равно последнему элементу, если указан
initialValue; в противном случае его значение равно предпоследнему элементу. -
currentIndex - Позиция индекса
currentValueв массиве. При первом вызове его значение равноarray.length - 1, если указанinitialValue, в противном случаеarray.length - 2. -
array - Массив, для которого был вызван
reduceRight().
-
-
initialValueНеобязательно - Значение, используемое в качестве аккумулятора при первом вызове
callbackFn. Если начальное значение не предоставлено, используется и пропускается последний элемент массива. ВызовreduceRight()для пустого массива без начального значения приводит кTypeError.
Возвращаемое значение
Значение, полученное в результате свёртки (редукции).
Описание
Метод reduceRight() является итеративным методом. Он выполняет функцию обратного вызова "редуктор" для всех элементов массива, в порядке убывания индекса, и накапливает их в единственное значение. Прочтите раздел итеративные методы для получения дополнительной информации о том, как эти методы работают в целом.
callbackFn вызывается только для тех индексов массива, которым присвоены значения. Он не вызывается для пустых слотов в разреженных массивах.
В отличие от других итеративных методов, reduceRight() не принимает аргумент thisArg. callbackFn всегда вызывается с undefined в качестве this, который заменяется на globalThis, если callbackFn нестрогий.
Метод reduceRight() является обобщённым (generic). Он ожидает, что значение this будет иметь свойство length и свойства с целочисленными ключами.
Все предостережения относительно reduce, обсуждаемые в разделе когда не следует использовать reduce(), применимы также к reduceRight. Поскольку в JavaScript нет семантики ленивых вычислений, нет разницы в производительности между reduce и reduceRight.
Примеры
Как работает reduceRight() без начального значения
Вызов callbackFn reduceRight будет выглядеть примерно так:
arr.reduceRight((accumulator, currentValue, index, array) => {
// …
});
При первом вызове функции accumulator и currentValue могут принимать одно из двух значений. Если в вызове reduceRight был предоставлен initialValue, то accumulator будет равен initialValue, а currentValue будет равен последнему значению в массиве. Если initialValue не был предоставлен, то accumulator будет равен последнему значению в массиве, а currentValue будет равен предпоследнему значению.
Если массив пуст и не был предоставлен initialValue, будет выброшена TypeError. Если массив содержит только один элемент (независимо от позиции) и initialValue не был предоставлен, или если initialValue предоставлен, но массив пуст, единственное значение будет возвращено без вызова callbackFn.
Несколько примеров прохода функции выглядят так:
[0, 1, 2, 3, 4].reduceRight( (accumulator, currentValue, index, array) => accumulator + currentValue, );
Обратный вызов будет вызван четыре раза, при этом аргументы и возвращаемые значения в каждом вызове будут следующими:
accumulator | currentValue | index | Возвращаемое значение | |
|---|---|---|---|---|
| Первый вызов | 4 | 3 | 3 | 7 |
| Второй вызов | 7 | 2 | 2 | 9 |
| Третий вызов | 9 | 1 | 1 | 10 |
| Четвертый вызов | 10 | 0 | 0 | 10 |
Параметр array никогда не меняется в процессе — он всегда [0, 1, 2, 3, 4]. Значение, возвращаемое reduceRight, будет значением последнего вызова обратного вызова (10).
Как работает reduceRight() с начальным значением
Здесь мы выполняем свёртку того же массива, используя тот же алгоритм, но с initialValue, равным 10, переданным в качестве второго аргумента reduceRight():
[0, 1, 2, 3, 4].reduceRight( (accumulator, currentValue, index, array) => accumulator + currentValue, 10, );
accumulator | currentValue | index | Возвращаемое значение | |
|---|---|---|---|---|
| Первый вызов | 10 | 4 | 4 | 14 |
| Второй вызов | 14 | 3 | 3 | 17 |
| Третий вызов | 17 | 2 | 2 | 19 |
| Четвертый вызов | 19 | 1 | 1 | 20 |
| Пятый вызов | 20 | 0 | 0 | 20 |
На этот раз значение, возвращаемое reduceRight, будет, конечно, 20.
Сумма всех значений в массиве
const sum = [0, 1, 2, 3].reduceRight((a, b) => a + b); // sum is 6
Последовательный запуск списка асинхронных функций с обратными вызовами, каждая из которых передает свои результаты следующей
const waterfall =
(...functions) =>
(callback, ...args) =>
functions.reduceRight(
(composition, fn) =>
(...results) =>
fn(composition, ...results),
callback,
)(...args);
const randInt = (max) => Math.floor(Math.random() * max);
const add5 = (callback, x) => {
setTimeout(callback, randInt(1000), x + 5);
};
const mul3 = (callback, x) => {
setTimeout(callback, randInt(1000), x * 3);
};
const sub2 = (callback, x) => {
setTimeout(callback, randInt(1000), x - 2);
};
const split = (callback, x) => {
setTimeout(callback, randInt(1000), x, x);
};
const add = (callback, x, y) => {
setTimeout(callback, randInt(1000), x + y);
};
const div4 = (callback, x) => {
setTimeout(callback, randInt(1000), x / 4);
};
const computation = waterfall(add5, mul3, sub2, split, add, div4);
computation(console.log, 5); // Logs 14
// same as:
const computation2 = (input, callback) => {
const f6 = (x) => div4(callback, x);
const f5 = (x, y) => add(f6, x, y);
const f4 = (x) => split(f5, x);
const f3 = (x) => sub2(f4, x);
const f2 = (x) => mul3(f3, x);
add5(f2, input);
};
Разница между reduce и reduceRight
const a = ["1", "2", "3", "4", "5"]; const left = a.reduce((prev, cur) => prev + cur); const right = a.reduceRight((prev, cur) => prev + cur); console.log(left); // "12345" console.log(right); // "54321"
Определение компонуемых функций
Композиция функций — это механизм объединения функций, при котором результат работы каждой функции передается следующей, а результат последней функции является окончательным результатом. В этом примере мы используем reduceRight() для реализации композиции функций.
См. также Композиция функций в Википедии.
const compose =
(...args) =>
(value) =>
args.reduceRight((acc, fn) => fn(acc), value);
// Increment passed number
const inc = (n) => n + 1;
// Doubles the passed value
const double = (n) => n * 2;
// using composition function
console.log(compose(double, inc)(2)); // 6
// using composition function
console.log(compose(inc, double)(2)); // 5
Использование reduceRight() с разреженными массивами
reduceRight() пропускает отсутствующие элементы в разреженных массивах, но не пропускает значения undefined.
console.log([1, 2, , 4].reduceRight((a, b) => a + b)); // 7 console.log([1, 2, undefined, 4].reduceRight((a, b) => a + b)); // NaN
Вызов reduceRight() для объектов, не являющихся массивами
Метод reduceRight() считывает свойство length объекта this, а затем обращается к каждому свойству, ключ которого является неотрицательным целым числом, меньшим, чем length.
const arrayLike = {
length: 3,
0: 2,
1: 3,
2: 4,
3: 99, // ignored by reduceRight() since length is 3
};
console.log(Array.prototype.reduceRight.call(arrayLike, (x, y) => x - y));
// -1, which is 4 - 3 - 2
Спецификации
Совместимость с браузерами
| Настольные | Мобильные | Серверные | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
reduceRight |
3 |
12 |
3 |
10.5 |
4 |
18 |
4 |
14 |
3.2 |
1.0 |
4.4 |
3.2 |
1.0.0 |
1.0 |
0.10.0 |
См. также
- Полифил
Array.prototype.reduceRightвcore-js - Полифил es-shims для
Array.prototype.reduceRight - Руководство по индексированным коллекциям (Indexed collections)
ArrayArray.prototype.map()Array.prototype.flat()Array.prototype.flatMap()Array.prototype.reduce()TypedArray.prototype.reduceRight()Object.groupBy()Map.groupBy()
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight