Menu
Coddy logo textTech

Метод Reduce

Часть раздела Логика и поток путешествия по JavaScript на Coddy. Урок 54 из 65.

Метод reduce() позволяет «свернуть» массив в одно значение, выполняя переданную функцию для каждого элемента массива. Это единственное значение может быть числом, строкой, объектом или даже другим массивом.

Вот синтаксис reducer:

array.reduce(function(accumulator, currentValue, currentIndex, array) {
    // вернуть обновленное значение аккумулятора
}, initialValue);

Ключевые компоненты:

  1. accumulator: Накапливает возвращаемые значения callback-функции (представьте это как промежуточную сумму)
  1. currentValue: Текущий обрабатываемый элемент в array
  1. currentIndex: (необязательно) Индекс текущего элемента
  1. array: (необязательно) Массив, для которого был вызван метод reduce()
  1. initialValue: (необязательно) Значение, используемое в качестве первого аргумента при первом вызове функции обратного вызова

Например — сумма чисел:

const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, curr) => acc + curr, 0);
console.log(sum); // 15

Как это работает по шагам:

const numbers = [1, 2, 3, 4];
const sum = numbers.reduce((acc, curr) => {
    console.log(`Accumulator: ${acc}, Current Value: ${curr}`);
    return acc + curr;
}, 0);

// Вывод:
// Аккумулятор: 0, Текущее значение: 1
// Аккумулятор: 1, Текущее значение: 2
// Аккумулятор: 3, Текущее значение: 3
// Аккумулятор: 6, Текущее значение: 4
// Итоговый результат: 10
challenge icon

Задание

Легко

Создайте функцию с именем calculateGroceryTotal, которая принимает массив объектов, представляющих продуктовые товары.

Каждый объект имеет два свойства:

  • name: строка (название товара)
  • price: число (цена товара)

Функция должна:

  1. Рассчитать общую стоимость всех товаров
  2. Применить скидку: если общая сумма превышает 100, применить скидку 10%
  3. Если общая сумма превышает 50, но меньше или равна 100, применить скидку 5%
  4. Без скидки для общей суммы 50 или менее.

Вернуть объект, содержащий:

  • originalTotal: сумма до скидки
  • discount: сэкономленная сумма
  • finalTotal: итоговая сумма после скидки

Попробуйте сами

function calculateGroceryTotal(items) {
    // Напишите код здесь
    


    return {
        originalTotal: Math.round(originalTotal * 100) / 100,  // Округлить до 2 десятичных знаков
        discount: Math.round(discount * 100) / 100,
        finalTotal: Math.round(finalTotal * 100) / 100
    };
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и поток

Потренируйтесь самостоятельно: Онлайн-компилятор JavaScript