如何基于多个属性区分对象

时间:2018-04-19 07:50:33

标签: javascript node.js ecmascript-6

我正在寻找一种方法来区分一个对象数组,该方法需要以两个属性为例,

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

过滤后只应返回2个对象的数组, George Hendricks George Marques 因为它们是唯一的。目前我只能使用 ES6 设置过滤

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

如何尽快完成任务(处理大数据)

2 个答案:

答案 0 :(得分:3)

如果属性值实际上是字符串,则可以将它们组合在一起以创建唯一键,然后使用对象(或Set)构建新数组以跟踪您已经看过的对象。使用对象或Set的好处是,您不必每次都重新扫描数组以查明条目是否唯一。与线性搜索相比,查找时间通常要好得多(甚至显着更好)。

以下是对象的示例:



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




或使用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);




答案 1 :(得分:2)

您可以使用 Array.filter() method 过滤数组,方法是搜索成对的namesurname

这应该是你的代码:

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

<强>演示:

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