Gosto muito de criar índices para essa solução, tenho uma função bem simples que me ajuda com isso:
function createIndex<T>(list: T[], key: keyof T) {
const DEFAULT_INDEX = {} as Record<string, T[]>;
return list.reduce((index, item) => {
const indexKey = String(item[key] as keyof typeof index);
const existKey = Boolean(index[indexKey]);
if (!existKey) {
index[indexKey] = [];
}
index[indexKey].push(item);
return index;
}, DEFAULT_INDEX);
}