Как убрать квадратичный поиск имён пользователей?

Повторный find даёт до O(NM) сравнений. Постройте Map пользователей по id один раз и используйте get: при обычной модели хеш-таблицы ожидаемое время станет O(N+M).

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

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

Повторный find даёт до O(NM) сравнений. Постройте Map пользователей по id один раз и используйте get: при обычной модели хеш-таблицы ожидаемое время станет O(N+M).

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

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

Условие

Код строит строки заказов: orders.map(o => ({...o, user: users.find(u => u.id === o.userId)})). Есть N заказов и M пользователей с уникальными id. Что неэффективно и как сохранить поведение при отсутствии пользователя?

Ответ

Повторный find даёт до O(NM) сравнений. Постройте Map пользователей по id один раз и используйте get: при обычной модели хеш-таблицы ожидаемое время станет O(N+M).

const byId = new Map(users.map(user => [user.id, user]));
const rows = orders.map(order => ({...order, user: byId.get(order.userId)}));

Дополнительная память — O(M), отсутствующий пользователь по-прежнему даёт undefined. Уникальность id важна: find вернул бы первое совпадение, а Map при повторных ключах сохранил бы последнее. Нельзя считать такую замену эквивалентной без проверки этого условия.

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

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

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

Подробнее