从对象数组中删除重复项但保留空字符串值对象

问题描述 投票:0回答:2

我有这个功能,效果很好,删除了重复的电子邮件。

contacts.filter((v,i,a)=>a.findIndex(v2=>(v2.email===v.email))===i);

但它似乎删除了带有空电子邮件字符串的对象,但我想保留这些对象。只应删除与电子邮件匹配的电子邮件

var arr = [
  {
    name: '1',
    city: 'lagos',
    email: '[email protected]',
  },
  {
    name: '2',
    city: 'abuja',
    email: '[email protected]',
  },
  {
    name: '3',
    city: 'ibadan',
    email: '',
  },
  {
    name: '4',
    city: 'kano',
    email: '',
  },
];

从上面的数组中,我想从 1 和 2 中删除重复项,同时保留 2 和 3。

javascript node.js lodash
2个回答
1
投票

使用lodash的

_.uniqBy()
对数组进行去重。在谓词函数中,为空字符串返回电子邮件或
Symbol
,因为符号始终是唯一的:

const arr = [{"name":"1","city":"lagos","email":"[email protected]"},{"name":"2","city":"abuja","email":"[email protected]"},{"name":"3","city":"ibadan","email":""},{"name":"4","city":"kano","email":""}];

const result = _.uniqBy(arr, o => o.email || Symbol());

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>


1
投票

为什么不把电子邮件写成“”的特殊情况?

改变

contacts.filter((v,i,a)=>a.findIndex(v2=>(v2.email===v.email))===i);

contacts.filter((v,i,a)=>
    v.email==="" || 
    a.findIndex(v2=>(v2.email===v.email))===i
);

这样一来,您就可以保持原来的功能按原样工作,并且只需添加保持

email:""
案例的能力即可。

© www.soinside.com 2019 - 2024. All rights reserved.