如果数组对象的两个属性相等,我如何删除数组中的对象?



我有一种情况,我需要在对象数组中找到重复的元素。对象包含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);

最新更新