Конспект JS-course

Метод reduce( )

Источники: https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

http://msdn.microsoft.com/ru-ru/library/ie/ff679975(v=vs.94).aspx

Метод reduce() вызывает заданную функцию обратного вызова для всех элементов в массиве. Возвращаемое значение функции обратного вызова представляет собой накопленный результат и предоставляется как аргумент в следующем вызове функции обратного вызова.

Синтаксис

arr.reduce(callback[, initialValue])

Параметры

callback Функция, выполняющаяся для каждого элемента массива, принимает четыре аргумента:

  • previousValue Значение, возвращённое предыдущим выполнением функции callback , либо значение initialValue, если оно предоставлено (смотрите пояснения ниже).
  • currentValue Текущий обрабатываемый элемент массива.
  • index Индекс текущего обрабатываемого элемента массива.
  • array Массив, для которого была вызвана функция reduce.

initialValue Необязательный параметр. Объект, используемый в качестве первого аргумента при первом вызове функции callback.

Описание

Метод reduce выполняет функцию callback один раз для каждого элемента, присутствующего в массиве, за исключением пустот, принимая четыре аргумента: начальное значение (или значение от предыдущего вызова callback), значение текущего элемента, текущий индекс и массив, по которому происходит итерация.

При первом вызове функции, параметры previousValue и currentValue могут принимать одно из двух значений. Если при вызове reduce передан аргумент initialValue, то значение previousValue будет равным значению initialValue, а значение currentValue будет равным первому значению в массиве. Если аргумент initialValue не задан, то значение previousValue будет равным первому значению в массиве, а значение currentValue будет равным второму значению в массиве.

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

Предположим, что reduce используется следующим образом:

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array) {
  return previousValue + currentValue;
});

Функция обратного вызова будет вызвана четыре раза, аргументы и возвращаемое значение при каждом вызове будут следующими:

0:0 previousValue currentValue index array возвращаемое значение
1-й вызов 0 1 1 [0, 1, 2, 3, 4] 1
2-й вызов 1 2 2 [0, 1, 2, 3, 4] 3
3-й вызов 3 3 3 [0, 1, 2, 3, 4] 6
4-й вызов 6 4 4 [0, 1, 2, 3, 4] 10

Значение, возвращённое reduce будет равным последнему результату выполнения функции обратного вызова (10). Если же вы зададите начальное значение initialValue, результат будет выглядеть так:

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array) {
  return previousValue + currentValue;
}, 10);
0:0 previousValue currentValue index array возвращаемое значение
1-й вызов 10 0 0 [0, 1, 2, 3, 4] 10
2-й вызов 10 1 1 [0, 1, 2, 3, 4] 11
3-й вызов 11 2 2 [0, 1, 2, 3, 4] 13
4-й вызов 13 3 3 [0, 1, 2, 3, 4] 16
5-й вызов 16 4 4 [0, 1, 2, 3, 4] 20

Значение, возвращённое reduce в этот раз, конечно же, будет равным 20.

Примеры

Пример: суммирование всех значений в массиве

var total = [0, 1, 2, 3].reduce(function(a, b) {
  return a + b;
});
// total == 6

Пример: разворачивание массива массивов

var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
  return a.concat(b);
});
// flattened равен [0, 1, 2, 3, 4, 5]