I have 3 objects
[
{name: 3, q: 10, b: 1},
{name: 5, q: 6, b: 2},
{name: 5, q: 7, b: 1}
]
I need to group them by name:
[
{name: 3: items: [{q:10, b: 1}]},
{name: 5: items: [{q:6, b: 2}, {q:7, b: 1}]},
]
maybe there are any delicate solutions with lodash?
You dont need lodash, you can just use JavaScript
const inputArray = [
{name: 3, q: 10, b: 1},
{name: 5, q: 6, b: 2},
{name: 5, q: 7, b: 1}
];
using forEach
function groupItemsByName(array) {
// create a groups to store your new items
const groups = {};
//loop through your array
array.forEach(obj => {
// destructure each object into name and the rest
const { name, ...rest } = obj;
// if the named group doesnt exist create that name with an empty array
if (!groups[name]) {
groups[name] = { name, items: [] };
}
// add the items to the named group based on the name
groups[name].items.push(rest);
});
return Object.values(groups);
}
const transformedArray = groupItemsByName(inputArray);
using reduce and Object.values()
function groupItemsByName(array) {
//Object.values returns an objects values as an array
return Object.values(
array.reduce((groups, obj) => {
// destructure as in the forEach method
const { name, ...rest } = obj;
// create the groups like in the previous method
groups[name] = groups[name] || { name, items: [] };
// push the items to the group based on the name
groups[name].items.push(rest);
return groups;
}, {})
);
}
const transformedArray = groupItemsByName(inputArray);
using map and reduce
const transformedArray = Array.from(
inputArray.reduce((map, obj) => {
const { name, ...rest } = obj;
const existing = map.get(name) || { name, items: [] };
existing.items.push(rest);
return map.set(name, existing);
}, new Map()).values()
);
output
console.log(transformedArray);