reduce() и reduceRight()
Методы reduce()
и reduceRight()
объединяют элементы массива, используя указанную вами функцию, и возвращают единственное значение. Это типичная операция в функциональном программировании, где она известна также под названием «свертка».
Используется для последовательной обработки каждого элемента массива с сохранением промежуточного результата. ( "свертывание массива" или представить массив одним значением)
Он применяет функцию callback по очереди к каждому элементу массива слева направо, сохраняя при этом промежуточный результат.
Аргументы функции callback(previousValue, currentItem, index, arr)
:
• previousValue - последний результат вызова функции, он же «промежуточный результат».
• currentItem - текущий элемент массива, элементы перебираются по очереди слева-направо.
• index - номер текущего элемента.
• arr - обрабатываемый массив.
Кроме callback, методу можно передать «начальное значение» – аргумент initialValue. Если он есть, то на первом вызове значение previousValue будет равно initialValue, а если у reduce()
нет второго аргумента, то оно равно первому элементу массива, а перебор начинается со второго.
var arr = [1, 2, 3, 4, 5]
// для каждого элемента массива запустить функцию,
// промежуточный результат передавать первым аргументом далее
var result = arr.reduce(function(sum, current) {
return sum + current;
}, 0);
console.log( result ); // 15
var a = [1,2,3,4,5]
var sum = a.reduce(function(x,y) { return x+y }, 0); // Сумма значений
var product = a.reduce(function(x,y) { return x*y }, 1); // Произвед. значений
var max = a.reduce(function(x,y) { return (x>y)?x:y; }); // Наибольш. значение
________________________________________________________
Метод reduce()
принимает два аргумента.
В первом передается функция, которая выполняет операцию свертки. Задача этой функции – объединить некоторым способом или свернуть два значения в одно и вернуть свернутое значение.
Во втором (необязательном) аргументе передается начальное значение для функции.
Функции, передаваемые методу reduce()
, отличаются от функций, передаваемых методам forEach()
и map()
. Знакомые уже значение, индекс и массив передаются им во втором, третьем и четвертом аргументах. А в первом аргументе передается накопленный результат свертки. При первом вызове в первом аргументе функции передается начальное значение, переданное методу reduce()
во втором аргументе. Во всех последующих вызовах передается значение, полученное в результате предыдущего вызова функции.
В первом примере, из приведенных выше, функция свертки сначала будет вызвана с аргументами 0 и 1. Она сложит эти числа и вернет 1. Затем она будет вызвана с аргументами 1 и 2 и вернет 3. Затем она вычислит 3+3=6, затем 6+4=10 и, наконец, 10+5=15. Это последнее значение 15 будет возвращено методом reduce()
.
Когда метод reduce()
вызывается без начального значения, в качестве начального значения используется первый элемент массива. Это означает, что при первом вызове функции свертки будут переданы первый и второй элементы массива.
Вызов метода reduce()
с пустым массивом без начального значения вызывает исключение TypeError
. Если вызвать метод с единственным значением – с массивом, содержащим единственный элемент, и без начального значения или с пустым массивом и начальным значением – он просто вернет это единственное значение, не вызывая функцию свертки.
_______________________________________________________
Методы every()
и some()
являются своеобразной разновидностью операции свертки массива. Однако они отличаются от reduce()
тем, что стремятся завершить обход массива как можно раньше и не всегда проверяют значения всех его элементов.
Методы reduce()
и reduceRight()
могут использоваться не только для математических вычислений.