Group objects by a key

Collect records by a string or numeric field without prototype-key collisions.

JavaScript Version 1.0.0 · MIT · .md

group-an-array-of-objects-by-a-key.js
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.

Local fixture scope · Node.js 22.23.2 · reviewed October 28, 2026. No external service is required.

Keep exploring

Type two or more characters. Try “duplicate”, “webhook” or “retry”.