When merging array of strings, I can use Set and ES6 to remove duplicates like so:
const a = ["hello", "hi", "yo"]
const b = ["alo", "hi"]
const remove_hi = [
...new Set([
...a,
...b,
]),
]
But how do I compare and remove objects? Say I have this:
const a = [
{id: "asd", name: "Hi"},
{id: "fgh", name: "Hello"},
{id: "123", name: "Hi"}
]
const b = [
{id: "jkl", name: "Yo"},
{id: "123", name: "Hi"}
]
// This will not work. It will have a duplicate of {id: "123", name: "Hi"}
const remove_hi = [
...new Set([
...a,
...b,
]),
]
How do I remove {id: "123", name: "Hi"} from a combined array with Set?
Advertisement
Answer
Use a Map to deduplicate by the key name:
const uniqueBy = (array, key) => [
...new Map(
array.map(o => [key(o), o])
).values()
];
const a = [
{id: "asd", name: "Hi"},
{id: "fgh", name: "Hello"},
{id: "123", name: "Hi"}
]
const b = [
{id: "jkl", name: "Yo"},
{id: "123", name: "Hi"}
]
const remove_hi = uniqueBy([...a, ...b], o => o.name);
console.log(remove_hi);Note that deduplicating only by name will remove both {id: "asd", name: "Hi"} and {id: "123", name: "Hi"} since they’d be considered duplicates of the last {id: "123", name: "Hi"} in the array when keying by name.
Replace o.name with whatever key you want to deduplicate by.