Применяет функцию к аккумулятору и каждому значению массива (слева-направо), сводя его к одному значению.

Спецификация: ECMAScript 5.1 (ECMA-262)
array.reduce(function callback(total, currentValue, currentIndex, arr), initialValue)

Параметры

callback
Функция, выполняющаяся для каждого элемента массива, принимает четыре аргумента:
  • total – значение из предыдущего вызова функции обратного вызова. Если значение initialValue предоставляется в метод reduce, то total является значением initialValue при первом вызове функции.
  • currentValue – текущий обрабатываемый элемент массива.
  • currentIndex – индекс текущего обрабатываемого элемента массива.
  • arr – массив, к которому принадлежит текущий элемент (по которому происходит проход).
initialValue
Необязательный параметр. Объект, используемый в качестве первого аргумента при первом вызове функции callback.

Возвращает накопленный результат с последнего вызова функции обратного вызова.

Метод reduce() используется для вычисления на основе массива какого-либо единого значения, иначе говорят «для свёртки массива».

Он применяет функцию callback по очереди к каждому элементу массива слева направо, сохраняя при этом промежуточный результат.

При первом вызове функции, параметры total и currentValue могут принимать одно из двух значений:

  • Если при вызове reduce() передан аргумент initialValue, то значение total будет равным значению initialValue, а значение currentValue будет равным первому значению в массиве.
  • Если аргумент initialValue не задан, то значение total будет равным первому значению в массиве, а значение currentValue будет равным второму значению в массиве.

Если массив пустой, а аргумент initialValue не указан, то будет сгенерировано исключение TypeError.
В случае, если массив состоит только из одного элемента и аргумент initialValue не указан, или если аргумент initialValue указан, но массив пустой, то будет возвращено одно это значение. При этом функции callback вызываться не будет.

Разберём работу метода reduce() на примере.

Например, в качестве «свёртки» мы хотим получить сумму всех элементов массива numbers:

Выполнить код »

При первом запуске total – исходное значение, с которого начинаются вычисления, равно нулю (второй аргумент метода reduce()initialValue). Значение currentValue будет равным первому значению в массиве, т. е. – единице.

Сначала функция вызывается с этим начальным значением и первым элементом массива, результат запоминается и передаётся в следующий вызов, уже со вторым аргументом массива, затем новое значение участвует в вычислениях с третьим аргументом и так далее.

  total currentValue currentIndex arr возвращаемое значение
первый вызов 0 1 0 [1, 2, 3, 4, 5] 1
второй вызов 0+1 2 1 [1, 2, 3, 4, 5] 3
третий вызов 0+1+2 3 2 [1, 2, 3, 4, 5] 6
четвёртый вызов 0+1+2+3 4 3 [1, 2, 3, 4, 5] 10
пятый вызов 0+1+2+3+4 5 4 [1, 2, 3, 4, 5] 15

Как видно из таблицы, результат предыдущего вызова передаётся в первый аргумент следующего и т. д.

Посмотрим, какой у нас получится результат, если не указать аргумент initialValue в вызове arr.reduce:

Выполнить код »

При отсутствии аргумента initialValue в качестве первого значения берётся первый элемент массива, а перебор элементов начинается со второго. Поэтому мы получили тот-же результат, что и в первом примере.

Таблица вычислений будет выглядеть точно так же, но за вычетом первой строки.

В следующем примере метод reduce используется для разворачивания массива, состоящего из трёх массивов:

Выполнить код »

Комментарии

пожелания к комментариям…
  • Приветствуются комментарии, соответствующие теме урока: вопросы, ответы, предложения.
  • Одну строчку кода оборачивайте в тег <code>, несколько строчек кода — в теги <pre><code>...ваш код...</code></pre>.
  • Допускаются ссылки на онлайн-песочницы (codepen, plnkr, JSBin и др.).