Для чего используется метод reduce() в JavaScript?

«Для чего используется метод reduce() в JavaScript?» — вопрос из категории JavaScript, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод reduce() ("свертка") используется для последовательной агрегации (накопления) всех элементов массива в одно конечное значение. Это мощный инструмент для сложных преобразований данных в Node.js.

Синтаксис:

const result = array.reduce((accumulator, currentValue, index, array) => {
  // Логика обновления аккумулятора
  return updatedAccumulator;
}, initialValue); // Начальное значение аккумулятора

Практические примеры в Node.js:

  1. Агрегация данных (сумма, произведение):

    const cartItems = [{ price: 10 }, { price: 20 }, { price: 30 }];
    const totalPrice = cartItems.reduce((sum, item) => sum + item.price, 0);
    // totalPrice = 60
  2. Преобразование массива в объект (часто используется для кэшей или lookup-таблиц):

    const users = [
      { id: 'u1', name: 'John' },
      { id: 'u2', name: 'Jane' }
    ];
    const usersById = users.reduce((acc, user) => {
      acc[user.id] = user;
      return acc;
    }, {});
    // usersById = { u1: {id:'u1', name:'John'}, u2: {...} }
    // Быстрый доступ: usersById['u1']
  3. Группировка данных:

    const orders = [
      { status: 'pending', amount: 100 },
      { status: 'shipped', amount: 200 },
      { status: 'pending', amount: 50 }
    ];
    const groupedByStatus = orders.reduce((groups, order) => {
      const status = order.status;
      if (!groups[status]) groups[status] = [];
      groups[status].push(order);
      return groups;
    }, {});
    // groupedByStatus = { pending: [...], shipped: [...] }
  4. Поиск максимального/минимального значения:

    const readings = [23, 45, 17, 89, 32];
    const maxReading = readings.reduce((max, val) => val > max ? val : max, -Infinity);

Важность начального значения (initialValue): Всегда явно указывайте его. Это делает код безопаснее и предсказуемее, особенно с пустыми массивами.