Spec-Zone.ru › JavaScript

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

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-array.prototype.reduceright

Совместимость с браузерами

Настольные Мобильные Серверные
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)
  • Array
  • Array.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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API