从javascript中的对象数组中删除重复值

新手上路,请多包涵

我有一组这样的对象:

 arr = [
    {label: Alex, value: Ninja},
    {label: Bill, value: Op},
    {label: Cill, value: iopop}
]

这个数组是在我的反应组件被渲染时组成的。我用户 Array.prototype.unshift 用于在我的数组顶部添加所需的元素。所以我写 arr.unshift({label: All, value: All}) 。当我的组件首次呈现时,我的数组已按我的意愿成功创建。但是当我重新渲染它时,它向我显示了值 {label: All, value: All} 的数组作为重复项。更具体地说,它显示如下:

 arr = [
    {label: All, value: All},
    {label: All, value: All},
    {label: Alex, value: Ninja},
    {label: Bill, value: Op},
    {label: Cill, value: iopop}
]

我怎样才能解决这个问题?我尝试了此处特定主题中描述的方法,但没有用

原文由 user7334203 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 496
2 个回答

您可以使用 array#reducearray#some

 const arr = [
    {label: 'All', value: 'All'},
    {label: 'All', value: 'All'},
    {label: 'Alex', value: 'Ninja'},
    {label: 'Bill', value: 'Op'},
    {label: 'Cill', value: 'iopop'}
]

var result = arr.reduce((unique, o) => {
    if(!unique.some(obj => obj.label === o.label && obj.value === o.value)) {
      unique.push(o);
    }
    return unique;
},[]);
console.log(result);

原文由 Hassan Imam 发布,翻译遵循 CC BY-SA 4.0 许可协议

一班轮解决方案:

独特的 labelvalue

 arr.filter((v,i,a)=>a.findIndex(v2=>(v.label === v2.label && v.value===v2.value))===i)

对象的所有属性都是唯一的:

 arr.filter((v,i,a)=>a.findIndex(v2=>(JSON.stringify(v) === JSON.stringify(v2)))===i)

原文由 chickens 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题