Group array of objects by property in Typescript

Here's a very useful function for grouping an array of objects by property in Typescript!

/**
 * Group array of objects by property
 */
export function groupBy<T, K extends keyof T>(
  objectArray: T[],
  property: K
): Record<string, T[]> {
  return objectArray.reduce((acc, obj) => {
    const key = String(obj[property]);
    if (!acc[key]) {
      acc[key] = [];
    }
    acc[key].push(obj);
    return acc;
  }, {} as Record<string, T[]>);
}

Example:

const arr = [
  { cat: "shoes", name: "flip flop", size: 40 },
  { cat: "shoes", name: "sneakers", size: 45 },
  { cat: "shirt", name: "short sleeve", size: 12 },
];
const grouped = groupBy(arr, "cat");

Output:

{
  "shoes": [
    {
      "cat": "shoes",
      "name": "flip flop",
      "size": 40
    },
    {
      "cat": "shoes",
      "name": "sneakers",
      "size": 45
    }
  ],
  "shirt": [
    {
      "cat": "shirt",
      "name": "short sleeve",
      "size": 12
    }
  ]
}