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.