Coding Challenge - #33: Group By Key

Write groupBy(items, key) that returns an object grouping the array of objects by the given property. groupBy([{t:"a",v:1},{t:"b",v:2},{t:"a",v:3}], "t") should give {a:[{t:"a",v:1},{t:"a",v:3}], b:[{t:"b",v:2}]}.

function groupBy(items, key) {
  // your code here
}

Rules:

  • Plain JavaScript, no libraries
  • Do not mutate the input array

Post your solution as a reply. Answer goes up in about a day.

You can use reduce() to group the items by the selected property without modifying the original array:

function groupBy(items, key) {
  return items.reduce((groups, item) => {
    const value = item[key];

    if (!Object.hasOwn(groups, value)) {
      groups[value] = [];
    }

    groups[value].push(item);
    return groups;
  }, {});
}

This keeps the original order of items within each group and runs in O(n) time on average. Object.hasOwn() also avoids treating inherited object properties as existing groups.