Map.groupBy удобен для временной группировки, но в production легко наткнуться на два подводных камня, о которых документация умалчивает. Ошибки связаны с мутабельностью ключей и сборкой мусора при использовании Symbol.
Проблема 1: Мутация групповых ключей
Когда ключи группировки — объекты, Map.groupBy возвращает Map, где ключи — ссылки на те же объекты. Любое изменение исходного объекта ломает соответствие в группах. Например, сгруппировали пользователей по объекту с ролью, а потом поменяли роль — grouped.get(тот же объект) покажет старые данные.
const users = [{role: 'admin'}];
const grouped = Map.groupBy(users, u => u.role);
users[0].role = 'guest'; // мутация
grouped.get('guest'); // undefined, ключ 'admin' осталсяСовет: используй только строки, числа или копии объектов, либо заморозь объекты через Object.freeze перед groupBy.
Проблема 2: Утечка памяти с Symbol-ключами и WeakRef
Symbol уникален и живёт, пока есть хоть одна ссылка. Если использовать Symbol как ключ в Map.groupBy, а потом потерять внешнюю ссылку — Symbol остаётся в Map, память не освобождается. WeakRef на Symbol не работает как слабая ссылка, так как Symbol не является объектом.
const key = Symbol('temp');
const grouped = Map.groupBy([1], () => key);
// ключ утечёт, даже после удаления внешней ссылкиОшибка: полагаться на WeakRef для Symbol-ключей в production. Выход — использовать WeakMap с объектными ключами для краткосрочной группировки, либо явно чистить Map через delete.
Вывод: Map.groupBy в production требует контроля над мутациями ключей и управления памятью через примитивные ключи или явную очистку, иначе рискуешь получить неконсистентные данные и утечки.