使用键从数组中删除重复对象
Remove duplicate objects from an array with Keys
如何通过属性筛选对象数组?例如在这个数组中,如果两个或多个对象具有相同的属性,如 name 和 lastname 我想删除其中一个并只留下唯一的一个数组。示例 arr:
[ {name: "George", lastname: "GeorgeLast", age: 12},
{name: "George", lastname: "GeorgeLast", age: 13},
{name: "Bob", lastname: "GeorgeLast", age: 12}]
结果应该是
[ {name: "George", lastname: "GeorgeLast", age: 13},
{name: "Bob", lastname: "GeorgeLast", age: 12}]
或
[ {name: "George", lastname: "GeorgeLast", age: 12},
{name: "Bob", lastname: "GeorgeLast", age: 12}]
应用this answer中所示的技术,即:
function onlyUnique(value, index, self) {
return self.indexOf(value) === index;
}
...但是使用 findIndex
和一些标准而不仅仅是 indexOf
.
let people = [
{ name: "George", lastname: "GeorgeLast", age: 12 },
{ name: "George", lastname: "GeorgeLast", age: 13 },
{ name: "Bob", lastname: "GeorgeLast", age: 12 }
]
let result = people.filter(
(person, index) => index === people.findIndex(
other => person.name === other.name
&& person.lastname === other.lastname
));
console.log(result);
至于留12岁的乔治还是留13岁的乔治,那是findIndex
如何运作的问题,return [=28]也是如此=]第一个个匹配元素。因此,在您的示例中,它将保留 12 岁的乔治。
另一个解决方案。
在这里你不需要遍历列表 n*n/2 次(如果我没记错的话)。
另一方面,这个看起来不那么简洁并且占用更多内存。
使用您喜欢的任何一个。
const arr = [
{name: "George", lastname: "GeorgeLast", age: 12},
{name: "George", lastname: "GeorgeLast", age: 13},
{name: "Bob", lastname: "GeorgeLast", age: 12}
];
const obj = {}
arr.forEach(v => {
if (!obj[v.name]) {
obj[v.name] = {}
}
if (!obj[v.name][v.lastname]) {
obj[v.name][v.lastname] = v;
}
})
const result = [];
Object.values(obj).forEach(nameObj =>
Object.values(nameObj).forEach(surnObj => result.push(surnObj))
);
console.log(result)
如何通过属性筛选对象数组?例如在这个数组中,如果两个或多个对象具有相同的属性,如 name 和 lastname 我想删除其中一个并只留下唯一的一个数组。示例 arr:
[ {name: "George", lastname: "GeorgeLast", age: 12},
{name: "George", lastname: "GeorgeLast", age: 13},
{name: "Bob", lastname: "GeorgeLast", age: 12}]
结果应该是
[ {name: "George", lastname: "GeorgeLast", age: 13},
{name: "Bob", lastname: "GeorgeLast", age: 12}]
或
[ {name: "George", lastname: "GeorgeLast", age: 12},
{name: "Bob", lastname: "GeorgeLast", age: 12}]
应用this answer中所示的技术,即:
function onlyUnique(value, index, self) {
return self.indexOf(value) === index;
}
...但是使用 findIndex
和一些标准而不仅仅是 indexOf
.
let people = [
{ name: "George", lastname: "GeorgeLast", age: 12 },
{ name: "George", lastname: "GeorgeLast", age: 13 },
{ name: "Bob", lastname: "GeorgeLast", age: 12 }
]
let result = people.filter(
(person, index) => index === people.findIndex(
other => person.name === other.name
&& person.lastname === other.lastname
));
console.log(result);
至于留12岁的乔治还是留13岁的乔治,那是findIndex
如何运作的问题,return [=28]也是如此=]第一个个匹配元素。因此,在您的示例中,它将保留 12 岁的乔治。
另一个解决方案。
在这里你不需要遍历列表 n*n/2 次(如果我没记错的话)。
另一方面,这个看起来不那么简洁并且占用更多内存。
使用您喜欢的任何一个。
const arr = [
{name: "George", lastname: "GeorgeLast", age: 12},
{name: "George", lastname: "GeorgeLast", age: 13},
{name: "Bob", lastname: "GeorgeLast", age: 12}
];
const obj = {}
arr.forEach(v => {
if (!obj[v.name]) {
obj[v.name] = {}
}
if (!obj[v.name][v.lastname]) {
obj[v.name][v.lastname] = v;
}
})
const result = [];
Object.values(obj).forEach(nameObj =>
Object.values(nameObj).forEach(surnObj => result.push(surnObj))
);
console.log(result)