🟨 JavaScript
Средняя
🕐 10 мин

Суммирование бонусов по отделам

Цель: освоить методы агрегации и суммирования данных в массиве объектов.

💡 Подсказка к решению

Эту задачу можно решить несколькими способами.

Способ 1: Использование Array.prototype.reduce

Этот метод идеально подходит для “свертывания” массива в одно значение, например, в объект.

  1. Инициализация: Начните reduce с пустого объекта {}.
  2. Итерация: На каждом шаге проверяйте, существует ли отдел в вашем объекте-аккумуляторе.
  3. Логика: Если отдела нет, создайте его. Если есть, прибавьте бонус.

Способ 2: Использование цикла (for...of или forEach)

Классический подход, который легко читается.

  1. Инициализация: Создайте пустой объект result = {}.
  2. Итерация: Переберите массив с помощью цикла.
  3. Логика: Внутри цикла выполняйте ту же логику, что и в reduce: проверяйте наличие отдела в result и обновляйте сумму бонусов.
👀 Решение #1

Решение 1: с использованием reduce

const sumBonusesByDepartment = (employees) => {
  // Начинаем \"свертывание\" массива с пустого объекта {}.
  // `acc` — это аккумулятор, который хранит итоговый объект.
  // `employee` — текущий обрабатываемый элемент массива.
  return employees.reduce((acc, employee) => {
    const { department, bonus } = employee;
 
    // Если в аккумуляторе еще нет такого отдела, инициализируем его.
    // Используем `|| 0` на случай, если бонус не указан.
    if (!acc[department]) {
      acc[department] = 0;
    }
 
    // Прибавляем бонус сотрудника к общей сумме для его отдела.
    acc[department] += bonus || 0;
 
    // Возвращаем обновленный аккумулятор для следующего шага.
    return acc;
  }, {}); // Начальное значение аккумулятора.
};

Анализ решения:

  • Сложность по времени: O(n), где n — количество сотрудников.
  • Сложность по памяти: O(k), где k — количество уникальных отделов.
👀 Решение #2

Решение 2: с использованием цикла for...of

const sumBonusesByDepartment = (employees) => {
  // Создаем пустой объект для хранения результатов.
  const result = {};
 
  // Перебираем каждого сотрудника в массиве.
  for (const employee of employees) {
    const { department, bonus } = employee;
 
    // Если отдела еще нет в результирующем объекте, создаем его.
    if (!result[department]) {
      result[department] = 0;
    }
 
    // Прибавляем бонус к сумме для соответствующего отдела.
    result[department] += bonus || 0;
  }
 
  // Возвращаем итоговый объект.
  return result;
};

Анализ решения:

  • Сложность по времени: O(n), так как мы проходим по массиву один раз.
  • Сложность по памяти: O(k), так как память расходуется на хранение result объекта.

Описание задачи

Вам нужно реализовать функцию sumBonusesByDepartment, которая принимает массив объектов employees. Каждый объект содержит информацию о сотруднике: name, department и bonus.

Функция должна вычислить общую сумму бонусов для каждого отдела и вернуть объект, где ключами являются названия отделов, а значениями — суммарный размер бонусов в этом отделе.

Примеры

const employees = [
  { name: 'Иван', department: 'Разработка', bonus: 1000 },
  { name: 'Мария', department: 'Продажи', bonus: 1500 },
  { name: 'Петр', department: 'Разработка', bonus: 1200 },
  { name: 'Анна', department: 'Продажи', bonus: 1800 },
  { name: 'Елена', department: 'HR', bonus: 800 }
];
 
sumBonusesByDepartment(employees);
// Ожидаемый результат:
// { 'Разработка': 2200, 'Продажи': 3300, 'HR': 800 }

Требования

  • Функция должна называться sumBonusesByDepartment.
  • Если входной массив пуст, функция должна вернуть пустой объект {}.
  • Если у сотрудника отсутствует поле bonus, его бонус следует считать равным 0.

🧑‍💻 Это не баг! Это фича!

Редактор кода намеренно скрыт на мобильном.

Поверь, так лучше: я оберегаю тебя от искушения писать код в неидеальных условиях. Маленький экран и виртуальная клавиатура — не лучшие помощники для программиста.

📖 Сейчас: Изучи задачу, продумай решение. Действуй как стратег.

💻 Потом: Сядь за компьютер, открой сайт и реализуй все идеи с комфортом. Действуй как код-джедай!