Группируйте по выбранному полю, а внутри используйте id как ключ. Текст требует убрать только id, но пример также убирает country; ниже выбран формат примера.
Группировка массива пользователей по выбранному полю с формированием вложенной карты ID
Группируйте по выбранному полю, а внутри используйте 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), входные объекты не меняются.