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

Группировка объектов по ключу

Цель: реализовать универсальную функцию для группировки данных, которая часто используется в обработке данных и аналитике.

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

Основная идея — перебрать массив и складывать элементы в объект, используя значение ключа для группировки.

  1. Инициализация: Создайте пустой объект для хранения результата (result = {}).
  2. Итерация: Переберите каждый объект (item) в исходном массиве с помощью цикла, например, forEach.
  3. Получение ключа: Для каждого объекта получите значение по ключу, указанному в аргументе key (groupKey = item[key]).
  4. Группировка:
    • Проверьте, существует ли в result свойство с именем groupKey (if (!result[groupKey])).
    • Если его нет, создайте его и присвойте ему пустой массив: result[groupKey] = [].
    • Добавьте текущий item в массив, соответствующий этому ключу: result[groupKey].push(item).
  5. Завершение: После перебора всех элементов верните result.

Этот подход можно элегантно реализовать с помощью метода Array.prototype.reduce.

👀 Решение
const groupBy = (arr, key) => {
  // Используем reduce для преобразования массива в объект.
  // accumulator (acc) — это объект, который мы будем строить.
  // current (obj) — текущий элемент массива.
  return arr.reduce((acc, obj) => {
    // Получаем значение ключа для текущего объекта.
    const groupKey = obj[key];
 
    // Если в аккумуляторе еще нет массива для этого ключа, создаем его.
    if (!acc[groupKey]) {
      acc[groupKey] = [];
    }
 
    // Добавляем текущий объект в массив, соответствующий его ключу.
    acc[groupKey].push(obj);
 
    // Возвращаем обновленный аккумулятор для следующей итерации.
    return acc;
  }, {}); // Начальное значение для аккумулятора — пустой объект.
};

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

  • Сложность по времени: O(n), где n — количество элементов в массиве. Мы проходим по массиву один раз.
  • Сложность по памяти: O(n), так как в худшем случае (если все ключи уникальны) мы создадим новый объект, содержащий все элементы исходного массива.

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

Вам нужно реализовать функцию groupBy, которая принимает массив объектов arr и строку key. Функция должна сгруппировать все объекты из массива по значению их свойства key и вернуть объект, где ключами являются значения свойства, а значениями — массивы объектов с этим ключом.

Этот метод невероятно полезен для организации данных, например, для группировки списка пользователей по городам или продуктов по категориям.

Примеры

const data = [
  { city: 'Москва', temp: 15 },
  { city: 'Лондон', temp: 12 },
  { city: 'Москва', temp: 18 },
  { city: 'Париж', temp: 20 },
  { city: 'Лондон', temp: 14 }
];
 
groupBy(data, 'city');
/*
{
  "Москва": [
    { "city": "Москва", "temp": 15 },
    { "city": "Москва", "temp": 18 }
  ],
  "Лондон": [
    { "city": "Лондон", "temp": 12 },
    { "city": "Лондон", "temp": 14 }
  ],
  "Париж": [
    { "city": "Париж", "temp": 20 }
  ]
}
*/

Требования

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

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

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

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

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

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