reduce()
- метод для работы с массивами, который применяет одну и туже функцию ко всем элементам слева-направо, возвращая на каждом этапе результирующее значение. reduce()
используется для агрегации данных, где итоговое значение зависит от всего набора данных в массиве.
array.reduce(function(accumulator, currentValue, index, array), initialValue)
function
- функция, которая выполняется каждый раз при обходе очередного элемента массива - результат переносится на следующий вызов.
accumulator
- значение возвращаемое функцией после каждого её выполнения, если не указан initialValue
, то на первом шаге принимает значение первого элемента массива.
currentValue
- элемент массива в текущей итерации. Если указан initialValue
, то во время первого обхода принимает значение первого элемента, в противном случае второго.
index
Необязательный - индекс обрабатываемого элемента.
array
Необязательный - имя обрабатываемого массива.
initialValue
Необязательный - если указано, то является начальным значением accumulator
.
Одна из самых частых задач которую решают с помощью метода reduce()
это сложение всех элементов массива.
let array = [1,2,3,4,15,19]
function sumElem(accumulator, currentValue) {
let sum = accumulator + currentValue
return sum
}
let result = array.reduce(sumElem, 2) // 46
Аналогичный результат можно получить используя стрелочную функцию.
let array = [1,2,3,4,15,19]
let result = array.reduce((accumulator, currentValue) => {
return accumulator + currentValue
}, 2) // 46
Шаг №1: accumulator
= 2 + 1, два берется из указанного нами initialValue
, плюс первый элемент массива.
Шаг №2: accumulator
= 3 + 2, три - это значение полученное с шага №1 плюс второй элемент.
Шаг №3: accumulator
= 5 + 3, пять - это значение с шага №2 плюс третий элемент.
И так далее, пока не будет обработан последний элемент, тогда accumulator
станет равен 46 и это будет результатом работы метода.
Аналогично задачу с подсчетом суммы элементов можно решить с помощью цикла for()
.
let array = [1,2,3,4,15,19]
let sum = 2
for (let i = 0; i < array.length; i++) {
sum = sum + array[i]
} // 46
Однако стоит помнить, что если в array
будет пропущен элемент, то результатом работы for()
будет NaN
, в свою очередь reduce()
проигнорирует пустоты и выдаст корректное значение.
Здесь мы также можем подсчитать сумму обращаясь к значениям свойства x
let array = [{x:1},{x:2},{x:3},{x:4},{x:15},{x:19}]
let result = array.reduce((accumulator, currentValue) => {
return accumulator + currentValue.x
}, 2) // 46
Для того, чтобы обработать все объекты в массиве начиная с первого необходимо указать initialValue
.
let courses = [
{course: 'JavaScript', price: '30000'},
{course: 'React', price: '40000'},
{course: 'HTML + CSS', price: '25000'},
]
let newArray = courses.reduce((newArr, elem) =>{
return {
...newArr,
[elem.course]: elem.price,
}
}, {}) // {JavaScript: '30000', React: '40000', HTML + CSS: '25000'}
reduce()
- это метод предназначенный для агрегации данных, лаконичен в записи, удобен для чтения и позволяет легко работать с массивами: суммировать элементы, находить среднее, большее или меньшее значение.
reduce()
работает с любыми типами данных, как с примитивными (числа, строки…), так и составными (массивы, объекты…).
Если reduce()
столкнется с пустыми массивом, тогда код вернет ошибку, если в массиве будет один элемент или хотя бы указан initialValue
, тогда вернет это значение.
Метод reduce()
может принять 5 аргументов, но обычно используются первые два: accumulator
(аккумулятор) и currentValue
(текущий обрабатываемый элемент массива), которые являются обязательными.