Группировка массива пользователей по выбранному полю с формированием вложенной карты ID

Группируйте по выбранному полю, а внутри используйте id как ключ. Текст требует убрать только id, но пример также убирает country; ниже выбран формат примера.

Короткий ответ

Что ответить на собеседовании

Группируйте по выбранному полю, а внутри используйте id как ключ. Текст требует убрать только id, но пример также убирает country; ниже выбран формат примера.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо сгруппировать массив объектов‑пользователей по одному из его полей (кроме id). Для каждой полученной группы следует создать объект (или Map), где:

  • ключами выступают значения id пользователей;
  • значениями – объекты пользователей без свойства id.
const users = [
    { id: 1, age: 20, name: "Иван", country: "Russia", registered: true },
    { id: 2, age: 30, name: "Дима", country: "USA", registered: true },
    { id: 3, age: 25, name: "Леха", country: "Russia", registered: false },
    { id: 4, age: 20, name: "Леха", country: "USA", registered: false },
    { id: 5, age: 30, name: "Иван", country: "Russia", registered: true },
    { id: 6, age: 50, name: "Леха", country: "Russia", registered: true },
    { id: 7, age: 20, name: "Дима", country: "USA", registered: false }
];

console.log(groupUsers(users, "country"));

/*
{
    "Russia": {
        "1": { age: 20, name: "Иван", registered: true },
        // ... остальные пользователи из России
    },
    "USA": {
        "2": { age: 30, name: "Дима", registered: true },
        // ... остальные пользователи из США
    }
}
*/

Функция groupUsers должна принимать массив и название поля, по которому происходит группировка, и возвращать структуру, описанную выше.

Ответ

Группируйте по выбранному полю, а внутри используйте id как ключ. Текст требует убрать только id, но пример также убирает country; ниже выбран формат примера.

function groupUsers(users, field) {
  if (field === 'id') throw new Error('Нельзя группировать по id');
  const result = Object.create(null);
  for (const user of users) {
    if (!Object.hasOwn(user, field)) throw new Error('Поле отсутствует');
    const { id, [field]: group, ...rest } = user;
    const bucket = result[String(group)] ??= Object.create(null);
    if (Object.hasOwn(bucket, id)) throw new Error('Повторный id внутри группы');
    bucket[id] = rest;
  }
  return result;
}

Если поле группировки должно остаться в значении, извлекайте только id, а ключ группы читайте из user[field]. Строковые ключи объединяют значения 1 и '1'; для различения типов используйте вложенные Map. Время O(n), входные объекты не меняются.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее