


reduce() проходит по элементам массива и передаёт результат предыдущего шага следующему. Этот промежуточный результат называют накопителем. Для суммы чисел задавайте начальное значение 0: тогда пустой массив тоже имеет понятный результат, а первый шаг не зависит от наличия первого элемента.
Пусть каждая задача хранит количество минут. Функция ниже принимает массив таких объектов и складывает только числовые значения.
const tasks = [
{ title: "read", minutes: 15 },
{ title: "practice", minutes: 25 }
];
const totalMinutes = tasks.reduce(
(total, task) => total + task.minutes,
0
);
console.log(totalMinutes); // 40
console.log([].reduce((sum, n) => sum + n, 0)); // 0
На первом шаге total равен нулю, а task содержит первое задание. Функция возвращает 15; на следующем шаге это число становится накопителем. Итог равен 40. Исходный массив в этом примере не изменяется, потому что функция только читает его элементы.
Без второго аргумента reduce берёт первый существующий элемент массива в качестве накопителя и начинает вызовы функции со следующего элемента. Для массива объектов это не число, поэтому простое удаление нуля из примера ломает контракт вычисления. Для пустого массива без initialValue возникает TypeError.
Начальное значение выбирают по смыслу: для суммы это 0, для произведения 1, для собираемого массива новый пустой массив. Если у операции нет естественного результата для пустого набора, это лучше выразить отдельной проверкой. Механическое добавление нуля подходит далеко не каждому вычислению.
Фигурные скобки в стрелочной функции требуют явного return. Если написать (sum, n) => { sum + n; }, результат шага будет undefined. Следующий вызов получит его в качестве накопителя.
Вторая проблема возникает на границе данных: строка "25" и число 25 ведут себя по-разному при сложении. Проверяйте вход, если его тип не гарантирован.
function sumMinutes(items) {
return items.reduce((total, item) => {
if (!Number.isFinite(item.minutes)) {
throw new TypeError("minutes должно быть конечным числом");
}
return total + item.minutes;
}, 0);
}
Этот пример предполагает, что каждый элемент является объектом с полем minutes; проверка полной структуры внешнего JSON остаётся отдельной задачей. Правило допустимости отрицательных минут тоже задаётся предметной областью. Сам reduce таких решений не принимает.
Для преобразования каждого элемента используйте map(), для отбора filter(). Если накопитель сложно читать или на каждом шаге копируется большой объект, обычный цикл может быть понятнее. Проверьте пустой массив, один элемент, несколько элементов и неправильный тип minutes. Не считайте лаконичность записи доказательством скорости.
На курсе JavaScript можно закрепить методы массивов на небольших задачах. Если нужно выбрать понятную форму обработки данных в проекте, найдите наставника по JavaScript на Mentoring.digital и принесите пример входа вместе с ожидаемым результатом.