I am trying to combine these two arrays of objects together and get the output below.
userid
property should be unique but not name
or role
Input
const first = [
{ userid: 2, name: "Velen" },
{ userid: 56, name: "Illidan" },
{ userid: 23, name: "Muradin" },
{ userid: 12, name: "Sylvanas" },
{ userid: 44, name: "Cenarius" },
{ userid: 4, name: "Gul'Dan" },
];
const second = [
{ userid: 2, role: "Mage" },
{ userid: 4, role: "Worlock" },
{ userid: 56, role: "Demon Hunter" },
{ userid: 66, role: "Druid" },
{ userid: 87, role: "Shaman" },
{ userid: 12, role: "Hunter" },
];
Output
[
{ name: 'Velen', role: 'Mage', userid: 2 },
{ name: "Gul'Dan", role: 'Worlock', userid: 4 },
{ name: 'Sylvanas', role: 'Hunter', userid: 12 },
{ name: 'Muradin', role: null, userid: 23 },
{ name: 'Cenarius', role: null, userid: 44 },
{ name: 'Illidan', role: 'Demon Hunter', userid: 56 },
{ name: null, role: 'Druid', userid: 66 },
{ name: null, role: 'Shaman', userid: 87 }
]
I tried this solution but it didn't work:
const solution = (first, second) => {
first.sort((a, b) => a.userid - b.userid);
second.sort((a, b) => a.userid - b.userid);
first.map((item, idx) => {
return {
a: (item.role = second[idx].role),
b: (item.userid = second[idx].userid),
};
});
return first;
};
console.log(solution(first, second));
You could reduce with an object and take a default object with nullified values.
const
first = [{ userid: 2, name: "Velen" }, { userid: 56, name: "Illidan" }, { userid: 23, name: "Muradin" }, { userid: 12, name: "Sylvanas" }, { userid: 44, name: "Cenarius" }, { userid: 4, name: "Gul'Dan" }],
second = [{ userid: 2, role: "Mage" }, { userid: 4, role: "Worlock" }, { userid: 56, role: "Demon Hunter" }, { userid: 66, role: "Druid" }, { userid: 87, role: "Shaman" }, { userid: 12, role: "Hunter" }],
result = Object.values([...first, ...second].reduce((r, o) => {
Object.assign(r[o.userid] ??= { name: null, role: null }, o);
return r;
}, {}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }