从具有关键帧的阵列中删除重复的对象



如何按属性筛选对象数组?例如,在这个数组中,如果两个或多个对象具有相同的属性,如namelastnameI希望删除其中任何一个,并在数组中只保留唯一的一个。示例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}]

应用此答案中显示的技术,即:

function onlyUnique(value, index, self) {
return self.indexOf(value) === index;
}

但是使用具有一些准则的CCD_ 1而不仅仅是CCD_。

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岁的George还是13岁的George,这是findIndex如何工作的问题,它恰好返回第一个匹配元素。因此,在你的例子中,它将保留12岁的乔治。

Map对象保存键值对并记住键的原始插入顺序。
const arr = [
{ name: "George", lastname: "GeorgeLast", age: 12 },
{ name: "George", lastname: "GeorgeLast", age: 13 },
{ name: "Bob", lastname: "GeorgeLast", age: 12 }
];

const newMap = new Map();
arr.forEach((item) => newMap.set(item.name, item));
console.log([...newMap.values()]);

另一个解决方案
在这里,您不需要对列表进行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)

最新更新