TGViewer
Настоящий JavaScript Настоящий JavaScript @true_js · 5.89K subscribers
Post #3651 331
⁣Map.groupBy в production: неожиданные мутации групповых ключей и утечки памяти при использовании Symbol-ключей с WeakRef

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 требует контроля над мутациями ключей и управления памятью через примитивные ключи или явную очистку, иначе рискуешь получить неконсистентные данные и утечки.
More from @true_js
  1. Oct 2, 2026😅 Айтишник отправил в одну компанию три одинаковых резюме и только одно дошло до финала О…
  2. Oct 2, 2026Post #3961
  3. Oct 2, 2026🤣 Правильно расставленные приоритеты в моей жизни би лайк: 💥 xCode Journal
  4. Oct 1, 2026🤯 Люди взбунтовались против «пыточной для ИИ» На GitHub заметили открытый проект AI Tortu…
  5. Oct 1, 2026День в Заонежье начинается ещё в дороге. Мы встретим вас в аэропорту или на вокзале. Дальш…
  6. Sep 30, 2026Книга из переписки без сервера: canvas, jsPDF и брошюра для печати прямо в браузере Пет-пр…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →