Group array items by a key or function. Returns a map of key to items.
export function groupBy<T, K extends string | number>(
arr: T[],
keyFn: keyof T | ((item: T) => K)
): Record<K, T[]> {
return arr.reduce((acc, item) => {
const key = typeof keyFn === 'function' ? (keyFn as (item: T) => K)(item) : (item[keyFn as keyof T] as K);
(acc[key] ??= [] as T[]).push(item);
return acc;
}, {} as Record<K, T[]>);
}
// groupBy(users, 'role') or groupBy(users, u => u.role)
Pass an array and a key (string) or function. Returns an object: key -> array of items.
Group list by category, status, or date.
groupBy(posts, (p) => p.status);