export type Group = { key: TK; items: T[] }; declare global { interface Array { groupBy(keyFn: (item: T) => TK): Group[]; intersect(other: T[]): T[]; } } if (!Array.prototype.groupBy) Array.prototype.intersect = function (this: T[], other: T[]): T[] { const set = new Set(this); return other.filter((i) => set.has(i)); }; if (!Array.prototype.groupBy) Array.prototype.groupBy = function ( this: T[], keyFn: (item: T) => TK, ): Group[] { const hash = new Map>(); this.forEach((item) => { const key = keyFn(item); let group = hash.get(key); if (!group) { group = { key, items: [] }; hash.set(key, group); } group.items.push(item); }); return [...hash.values()]; }; export default {};