То, что вы реализовали, довольно правильно, позвольте мне убрать побочные эффекты, используя редуктор:
const arr = [
{
id: 1,
name: "one",
groupByThisKey: 'groupA'
},
{
id: 2,
name: "two",
groupByThisKey: 'groupB'
},
{
id: 3,
name: "three",
groupByThisKey: 'groupB'
},
{
id: 4,
name: "four",
groupByThisKey: 'groupA'
}
];
console.log(arr.reduce((groupedByKey,obj) => {
if (groupedByKey[obj.groupByThisKey])
groupedByKey[obj.groupByThisKey].push(obj)
else
groupedByKey[obj.groupByThisKey] = [obj]
return groupedByKey;
}, {}));
Здесь вы найдете самый fp-ish способ написания.Не очень эффективно, следующая версия ниже (после этого) будет иметь лучшую производительность, потому что это не новое создание объектов или массивов на самой итерации.
const arr = [
{
id: 1,
name: "one",
groupByThisKey: 'groupA'
},
{
id: 2,
name: "two",
groupByThisKey: 'groupB'
},
{
id: 3,
name: "three",
groupByThisKey: 'groupB'
},
{
id: 4,
name: "four",
groupByThisKey: 'groupA'
}
];
console.log(arr.reduce(
(groups, x) =>
({
...groups,
[x.groupByThisKey]: [
...(groups[x.groupByThisKey] || []),
x
]
})
, {}
))
Упрощенная версия, которая имеет ту же логику, что и выше:
const arr = [
{
id: 1,
name: "one",
groupByThisKey: 'groupA'
},
{
id: 2,
name: "two",
groupByThisKey: 'groupB'
},
{
id: 3,
name: "three",
groupByThisKey: 'groupB'
},
{
id: 4,
name: "four",
groupByThisKey: 'groupA'
}
];
console.log(arr.reduce(
(groups, x) => {
let key = x.groupByThisKey;
if (groups[key] === undefined)
groups[key] = [];
groups[key].push(x);
return groups;
}, {}
))