Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to distinct an object based off multiple attributes

I am looking for a way to distinct an array of objects, the method needs to distinct by two attributes for instance,

let arr = [
    {
        name: "George",
        surname: "Hendricks"
    },
    {
        name: "George",
        surname: "Marques"
    },
    {
        name: "George",
        surname: "Hendricks"
    }
]

Once filtered should only return an array of 2 objects, George Hendricks and George Marques As they are unique. Currently I can only filter with ES6 Set like so

let uniArr = [...(new Set(arr))]

How can I accomplish my task as fast as possible (working with big data)

like image 596
adot Avatar asked Mar 28 '26 17:03

adot


1 Answers

If the property values are really strings, you can combine them to make a unique key, and then build a new array using an object (or Set) to track the ones you've already seen. The advantage to using an object or Set is that you don't have to re-scan the array every time to find out if an entry is unique. Lookup time on them is typically much better (even dramatically better) than a linear search.

Here's an example with an object:

let arr = [
    {
        name: "George",
        surname: "Hendricks"
    },
    {
        name: "George",
        surname: "Marques"
    },
    {
        name: "George",
        surname: "Hendricks"
    },
];
let seen = Object.create(null);
let filtered = arr.filter(entry => {
  const key = entry.name + "\u0000" + entry.surname;
  //                       ^---- a string you know won't be in either name or surname
  const keep = !seen[key];
  if (keep) {
    seen[key] = true;
  }
  return keep;
});
console.log(filtered);

Or with a Set:

let arr = [
    {
        name: "George",
        surname: "Hendricks"
    },
    {
        name: "George",
        surname: "Marques"
    },
    {
        name: "George",
        surname: "Hendricks"
    },
];
let seen = new Set();
let filtered = arr.filter(entry => {
  const key = entry.name + "\u0000" + entry.surname;
  //                       ^---- a string you know won't be in either name or surname
  const keep = !seen.has(key);
  if (keep) {
    seen.add(key);
  }
  return keep;
});
console.log(filtered);
like image 71
T.J. Crowder Avatar answered Mar 31 '26 07:03

T.J. Crowder



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!