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);
}