Group objects by a key
Collect records by a string or numeric field without prototype-key collisions.
function groupBy({ values, key }) { const groups = new Map(); for (const value of values) { const group = String(value[key]); groups.set(group, [...(groups.get(group) || []), value]); } return Object.fromEntries(groups); }
Input & expected output
Input
{
"values": [
{
"recipient": "[email protected]",
"status": "delivered"
},
{
"recipient": "[email protected]",
"status": "deferred"
},
{
"recipient": "[email protected]",
"status": "delivered"
}
],
"key": "status"
}Expected output
{
"delivered": [
{
"recipient": "[email protected]",
"status": "delivered"
},
{
"recipient": "[email protected]",
"status": "delivered"
}
],
"deferred": [
{
"recipient": "[email protected]",
"status": "deferred"
}
]
}The edge case
Input
{
"values": [
{
"team": "__proto__"
}
],
"key": "team"
}Expected output
{
"__proto__": [
{
"team": "__proto__"
}
]
}Know the limits
- Every record must own the grouping field, with a string or number value.
- Group keys become strings, so numeric 1 and string "1" share a group.
The function above is the implementation used by the lab. The lab validates JSON types and caps size before execution; include equivalent validation when accepting untrusted input in your application.
Source & maintenance
Based on Group an array of objects by a key from the original 1loc collection by Nguyen Huu Phuoc. Copyright (c) 2020 phuoc-ng. MIT licensed.
Curated implementation; explicit input bounds, edge cases, local fixtures and rebuilt presentation. Original MDX retained as inert source evidence.
Maintained by Oveyon. Source commit: 14b481cf60df. Read the license.
Keep exploring
- Clone an array — Create a new array without copying the objects inside it.
- Remove duplicate values — Keep the first occurrence of each value, in its original order.
- Flatten a nested array — Turn a nested array into one sequence of values.