Skip to content
dreamcode
dreamcode
Peaks
Group By Key
IntermediateTypeScript
Reward: +60 XP
PROBLEM

Group By Key

Write a generic groupBy<T, K extends keyof T>(items: T[], key: K): Record<string, T[]> that groups items by the value of one of their properties.

Each group's name is the property value turned into a string, and items keep their original order inside a group. Because K extends keyof T, calling groupBy(stars, "colour") on objects without a colour property is a compile error, not a runtime surprise.

Examples
groupBy([{ name: "Vega", colour: "blue" }, { name: "Betelgeuse", colour: "red" }, { name: "Rigel", colour: "blue" }], "colour")
{ blue: [{ name: "Vega", colour: "blue" }, { name: "Rigel", colour: "blue" }], red: [{ name: "Betelgeuse", colour: "red" }] }
groupBy([{ id: 1, tier: 2 }, { id: 2, tier: 1 }, { id: 3, tier: 2 }], "tier")
{ "1": [{ id: 2, tier: 1 }], "2": [{ id: 1, tier: 2 }, { id: 3, tier: 2 }] }
solution.ts
TYPESCRIPT
Saved as you type

Tests

0 of 3 passing
  • stars by colour
    groupBy([{ name: "Vega", colour: "blue" }, { name: "Betelgeuse", colour: "red" }, { name: "Rigel", colour: "blue" }], "colour")
    expected { blue: [{ name: "Vega", colour: "blue" }, { name: "Rigel", colour: "blue" }], red: [{ name: "Betelgeuse", colour: "red" }] }
  • numbers become group names
    groupBy([{ id: 1, tier: 2 }, { id: 2, tier: 1 }, { id: 3, tier: 2 }], "tier")
    expected { "1": [{ id: 2, tier: 1 }], "2": [{ id: 1, tier: 2 }, { id: 3, tier: 2 }] }
  • no items
    groupBy([], "type")
    expected {}
On the line
+60 XP
Pass all 3 tests to claim it.