我有一种情况,我需要在对象数组中找到重复的元素。对象包含4个属性
{
id:"1",
userName:"userName",
name:"name1",
address:"address!"
}
我的数组对象是这样的。
[{
id:"1",
userName:"userName",
name:"name1",
address:"address!"
},{
id:"1",
userName:"userName",
name:"name2",
address:"address!"
},{
id:"2",
userName:"userName2",
name:"name3",
address:"address!"
},{
id:"3",
userName:"userName3",
name:"name4",
address:"address!"
},{
id:"4",
userName:"userName4",
name:"name5",
address:"address!"
}]
两个对象相等的规则是id用户名和对于各自的对象应该是相等的。该对象应标记为重复对象并删除,如果存在重复对象,则只保留该对象。在上面的数组中,删除重复元素后的结果应该是这样的
[{
id:"1",
userName:"userName",
name:"name1",
address:"address!"
},{
id:"2",
userName:"userName2",
name:"name1",
address:"address!"
},{
id:"3",
userName:"userName3",
name:"name1",
address:"address!"
},{
id:"4",
userName:"userName4",
name:"name1",
address:"address!"
}]
如果输入类似于
[{
id:"1",
userName:"",
name:"name1",
address:"address!"
},{
id:"2",
userName:"",
name:"name1",
address:"address!"
},{
id:"3",
userName:"userName3",
name:"name1",
address:"address!"
},{
id:"3",
userName:"userName3",
name:"name1",
address:"address!"
}]
输出像下面
[{
id:"1",
userName:"",
name:"name1",
address:"address!"
},{
id:"2",
userName:"",
name:"name1",
address:"address!"
},{
id:"3",
userName:"userName3",
name:"name1",
address:"address!"
}]
请建议有什么简单的方法可以在打字稿中做到这一点?
我试着
_.uniq(contacts, (user) => {
return user.id && user.userName;
});
这似乎不像预期的那样工作。
一种方法是使用reduce()
。
下面的代码基本上是这样的:
- 以空输出数组 开头
- 输入测试的每个元素,如果它已经在输出中(基于userName和id)
- 如果不是,则添加它,如果是,则什么都不做
希望这对你有帮助。
const input = [{
id:"1",
userName:"userName",
name:"name1",
address:"address!"
},{
id:"1",
userName:"userName",
name:"name2",
address:"address!"
},{
id:"2",
userName:"userName2",
name:"name3",
address:"address!"
},{
id:"3",
userName:"userName3",
name:"name4",
address:"address!"
},{
id:"4",
userName:"userName4",
name:"name5",
address:"address!"
}]
const output = input.reduce(
(acc, item) =>
acc.find((e) => e.userName === item.userName && e.id === item.id)
? acc
: acc.concat([item]),
[]
);
console.log(output);