Aggregate Objects on Keys
const endorsements = [
{ skill: "css", user: "Bill" },
{ skill: "javascript", user: "Chad" },
{ skill: "javascript", user: "Bill" },
{ skill: "css", user: "Sue" },
{ skill: "javascript", user: "Sue" },
{ skill: "html", user: "Sue" },
];
console.log(Aggregate(endorsements, "user", "skill"));
[
{
user: "Bill",
skill: ["css", "javascript"],
},
{
user: "Chad",
skill: ["javascript"],
},
{
user: "Sue",
skill: ["css", "javascript", "html"],
},
];
function Aggregate(objects, on, who) {
const aggregate = objects.reduce((prev, curr) => {
const onValue = curr[on];
const whoValue = curr[who];
if (!prev[onValue]) {
prev[onValue] = {
[on]: onValue,
[who]: [whoValue],
};
} else {
prev[onValue] = {
[on]: onValue,
[who]: [...prev[onValue][who], whoValue],
};
}
return prev;
}, {});
return Object.values(aggregate);
}