> Как обрабатывать дублирующиеся ключи при преобразовании массива объектов в объект в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Яндекс

Стек: JavaScript

> Пример ответа

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

При преобразовании массива объектов в объект дублирующиеся ключи обрабатываются через явное разрешение коллизий. Используйте reduce или Object.fromEntries с кастомным merge-логикой. Стандартные методы перезаписывают последним значением. Для осознанного выбора стратегии (последний, первый, суммирование, массив значений) применяйте проверку существования ключа и условное присвоение.

Подробное объяснение

Проблема возникает, когда несколько элементов массива имеют одинаковое значение ключа, по которому строится результирующий объект. JavaScript не предоставляет встроенного механизма для обработки дубликатов - последнее присвоенное значение перезаписывает предыдущие.

Основные стратегии:

  • Последний wins - дефолтное поведение, простое присвоение
  • Первый wins - проверка if (!result[key]) перед присвоением
  • Массив значений - группировка всех значений по ключу
  • Агрегация - суммирование, конкатенация, кастомная логика

Выбор стратегии зависит от бизнес-требований: уникальность идентификаторов, необходимость сохранения истории изменений, статистические данные.

На практике

В реальных проектах дубликаты ключей часто возникают при:

  • Нормализации данных из API (несколько записей с одним ID)
  • Трансформации плоских списков в lookup-таблицы
  • Группировке данных для визуализации

Ключевой trade-off: производительность vs гибкость. reduce даёт полный контроль, но медленнее Object.fromEntries на больших массивах. Для критичных по скорости участков используйте Map с последующей конвертацией.

Пример кода

JAVASCRIPT
const users = [
{ id: 1, name: 'Alice', role: 'admin' },
{ id: 2, name: 'Bob', role: 'user' },
{ id: 1, name: 'Alice Updated', role: 'superadmin' }
];
// Стратегия: последний wins (дефолт)
const byIdLast = Object.fromEntries(
users.map(u => [u.id, u])
);
// { 1: { id: 1, name: 'Alice Updated', role: 'superadmin' }, 2: ... }
// Стратегия: первый wins
const byIdFirst = users.reduce((acc, user) => {
if (!acc[user.id]) acc[user.id] = user;
return acc;
}, {});
// Стратегия: массив значений
const byIdArray = users.reduce((acc, user) => {
(acc[user.id] = acc[user.id] || []).push(user);
return acc;
}, {});
// Стратегия: агрегация (суммирование баллов)
const scores = [
{ userId: 1, points: 10 },
{ userId: 1, points: 20 },
{ userId: 2, points: 5 }
];
const totalScores = scores.reduce((acc, { userId, points }) => {
acc[userId] = (acc[userId] || 0) + points;
return acc;
}, {});

Как отвечать на собеседовании

Начните с чёткого определения проблемы: "дублирующиеся ключи - это коллизия, которую нужно явно разрешать". Перечислите 3-4 стратегии с примерами. Упомяните, что выбор зависит от контекста: для уникальных идентификаторов подойдёт последний wins, для истории изменений - массив значений.

Покажите понимание trade-off: reduce универсален, но Object.fromEntries быстрее для простых случаев. Упомяните альтернативу с Map, если нужна гарантия порядка вставки.

Завершите практическим советом: "в production-коде всегда документируйте выбранную стратегию, так как поведение с дубликатами неочевидно для других разработчиков".

Что проверяет интервьюер

  • Понимание, что JavaScript не обрабатывает дубликаты ключей автоматически
  • Умение выбирать подходящую стратегию под задачу
  • Знание методов трансформации массивов (reduce, Object.fromEntries)
  • Осознание последствий для производительности и читаемости кода
  • Способность предусмотреть edge cases (пустой массив, нечисловые ключи)

Типичные ошибки

  • Использование Object.assign без учёта дубликатов (перезапись последним)
  • Предположение, что Object.fromEntries выбросит ошибку при дубликатах
  • Мутация исходного массива внутри reduce
  • Игнорирование проверки на существование ключа при стратегии "первый wins"
  • Смешивание типов значений в результирующем объекте (например, объект и массив)

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью