我正在寻找一种方法来区分一个对象数组,该方法需要以两个属性为例,
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))]
如何尽快完成任务(处理大数据)
答案 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 过滤数组,方法是搜索成对的name
和surname
。
这应该是你的代码:
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);