最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How to distinct an object based off multiple attributes - Stack Overflow

programmeradmin0浏览0评论

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 acplish my task as fast as possible (working with big data)

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 acplish my task as fast as possible (working with big data)

Share Improve this question edited Apr 19, 2018 at 7:53 adot asked Apr 19, 2018 at 7:50 adotadot 3981 gold badge3 silver badges16 bronze badges 2
  • Are the property values really strings? – T.J. Crowder Commented Apr 19, 2018 at 7:52
  • 1 @T.J.Crowder Yes they are – adot Commented Apr 19, 2018 at 7:52
Add a ment  | 

2 Answers 2

Reset to default 5

If the property values are really strings, you can bine 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);

You can use Array.filter() method to filter the array, by searching over the couple name and surname.

This is how should be your code:

var filtered = arr.filter((person, index, selfArray) =>
  index === selfArray.findIndex((p) => (
    p.name === person.name && p.surname === person.surname
  ))
);

Demo:

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

var filtered = arr.filter((person, index, selfArray) =>
  index === selfArray.findIndex((p) => (
    p.name === person.name && p.surname === person.surname
  ))
);

console.log(filtered);

发布评论

评论列表(0)

  1. 暂无评论