Метод массива reduce применяет к массиву переданную в него функцию и возвращает одно итоговое значение.
Метод принимает два аргумента функция и начальное значение аккумулятора. Аккумулятор это итоговое значение, которое как-то меняется на каждой итерации и возвращается после совершения всех итераций.
В свою очередь функция может принимать 4 значения:
- Аккумулятор
- Текущий элемент массива
- Текущий индекс
- Массив
Если в методе reduce не передать аккумулятор, то он примет значение первого элемента массива. А текущий элемент в свою очередь примет значение второго элемента массива.
Пример: сумма элементов массива с помощью reduce
Для наглядности разберем пример, с выводом промежуточных шагов.
data = [1, 2, 3, 4, '5'];
console.log("Пример, когда аккумулятор задан")
data.reduce(function test(acc, currentItem, index, array) {
console.log("Аккумулятор:", acc, "Текущий элемент:", currentItem, "Текущая позиция:", index);
return acc + currentItem;
}, 0)
console.log()
console.log("Пример, когда аккумулятор НЕ задан");
data.reduce(function test(acc, currentItem, index) {
console.log("Аккумулятор:", acc, "Текущий элемент:", currentItem, "Текущая позиция:", index);
return acc + currentItem;
})
Получаем следующий результат:
Пример, когда аккумулятор задан Аккумулятор: 0 Текущий элемент: 1 Текущая позиция: 0 Аккумулятор: 1 Текущий элемент: 2 Текущая позиция: 1 Аккумулятор: 3 Текущий элемент: 3 Текущая позиция: 2 Аккумулятор: 6 Текущий элемент: 4 Текущая позиция: 3 Аккумулятор: 10 Текущий элемент: 5 Текущая позиция: 4 Пример, когда аккумулятор НЕ задан Аккумулятор: 1 Текущий элемент: 2 Текущая позиция: 1 Аккумулятор: 3 Текущий элемент: 3 Текущая позиция: 2 Аккумулятор: 6 Текущий элемент: 4 Текущая позиция: 3 Аккумулятор: 10 Текущий элемент: 5 Текущая позиция: 4
Мы получили сумму элементов массива с помощью метода reduce.
В первом случае, мы задали начальное значение аккумулятора. А во втором случае не указывали, получилось на одну итерацию меньше, но результат такой же.
Пример 2: задача на собеседовании по использованию метода reduce
Задачу взял из этой статьи
На данном этапе моего обучения, мне кажется самым удачным такое решение:
data = [1, 2, 3, 4, '5'];
console.log()
console.log("Сумма или конкатенация");
let result = data.reduce(function sumNumberOrString(acc, currentItem, index) {
console.log("Аккумулятор:", acc, "Текущий элемент:", currentItem, "Текущая позиция:", index);
return acc + currentItem;
}, acc = data.every(item => typeof item === 'number') ? 0 : "")
console.log(result);
Результат с выводом промежуточных шагов
Сумма или конкатенация Аккумулятор: Текущий элемент: 1 Текущая позиция: 0 Аккумулятор: 1 Текущий элемент: 2 Текущая позиция: 1 Аккумулятор: 12 Текущий элемент: 3 Текущая позиция: 2 Аккумулятор: 123 Текущий элемент: 4 Текущая позиция: 3 Аккумулятор: 1234 Текущий элемент: 5 Текущая позиция: 4 12345
Так как в JS динамическая типизация, то сумма будет считаться в зависимости от типа переменной.
Я проверяю являются ли все элементы числами и в зависимости от этого, задаю начальное значение аккумулятора
acc = data.every(item => typeof item === 'number') ? 0 : "")
Буду рад любой обратной связи в комментариях)