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

Ответ

Метод 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): Всегда явно указывайте его. Это делает код безопаснее и предсказуемее, особенно с пустыми массивами.

Ответ 18+ 🔞

А, ну вот, опять этот reduce! Слушай, объясню тебе, как есть, без этих заумных учебников. Представь, что у тебя куча каких-то штук, а тебе надо из них сделать одну. Вот reduce — это как если бы ты собирал разбросанные по полу детали от конструктора в одну здоровенную хреновину. Или как если бы ты считал, сколько бабла потратил за месяц, складывая все чеки.

Синтаксис, блядь:

const result = array.reduce((accumulator, currentValue, index, array) => {
  // Тут ты колдуешь и говоришь, как аккумулятор обновлять
  return updatedAccumulator;
}, initialValue); // Вот это начало, стартовая точка! Не забудь, а то охуеешь потом.

Смотри, как это в жизни выглядит, ёпта:

  1. Сумма, например, в корзине:

    const cartItems = [{ price: 10 }, { price: 20 }, { price: 30 }];
    const totalPrice = cartItems.reduce((sum, item) => sum + item.price, 0);
    // Итого: 60. Проще некуда, правда?
  2. Сделать из массива объект для быстрого поиска. Очень хитрая жопа, но полезная:

    const users = [
      { id: 'u1', name: 'John' },
      { id: 'u2', name: 'Jane' }
    ];
    const usersById = users.reduce((acc, user) => {
      acc[user.id] = user; // Запихнул юзера в объект по его же айдишнику
      return acc;
    }, {});
    // Теперь чтобы найти John, не надо перебирать весь массив. Просто 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;
    }, {});
    // Получится объект { pending: [...], shipped: [...] }. Всё разложено по полочкам, красота!
  4. Найти максимум. Да похуй, можно и Math.max, но через reduce тоже можно, если очень хочется:

    const readings = [23, 45, 17, 89, 32];
    const maxReading = readings.reduce((max, val) => val > max ? val : max, -Infinity);
    // Прошёлся по всем, запомнил самого большого. 89, ясное дело.

И главное, чувак, про начальное значение (initialValue): Не будь распиздяем, всегда его указывай явно. Особенно когда массив может быть пустым. Представь: пустой массив, начального значения нет — и твой код накрылся медным тазом с ошибкой. А так, даже если массив пустой, reduce просто вернёт тебе этот самый initialValue, и всё будет спокойно. Доверия к пустым массивам — ноль ебать, так что перестрахуйся.