Источники: 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 Функция, выполняющаяся для каждого элемента массива, принимает четыре аргумента:
callback
, либо значение initialValue
, если оно предоставлено (смотрите пояснения ниже).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]