Array.reduce()
Применяет функцию к аккумулятору и каждому значению массива (слева-направо), сводя его к одному значению.
Спецификация: ECMAScript 5.1 (ECMA-262)Синтаксис
array.reduce(function callback(total, currentValue, currentIndex, arr), initialValue)
Параметры
- callback
- Функция, выполняющаяся для каждого элемента массива, принимает четыре аргумента:
- total – значение из предыдущего вызова функции обратного вызова. Если значение
initialValue
предоставляется в методreduce
, тоtotal
является значениемinitialValue
при первом вызове функции. - currentValue – текущий обрабатываемый элемент массива.
- currentIndex – индекс текущего обрабатываемого элемента массива.
- arr – массив, к которому принадлежит текущий элемент (по которому происходит проход).
- total – значение из предыдущего вызова функции обратного вызова. Если значение
- 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
используется для разворачивания массива, состоящего из трёх массивов:
Поддержка браузерами
Метод | |||||||
reduce | Да | 10.5 | Да | 4.0 | 3.0 | 9.0 | Да |
Комментарии
<code>
, несколько строчек кода — в теги<pre><code>
...ваш код...</code></pre>
.