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

27

我有一个像这样的对象数组:

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

这个数组是在我的React组件渲染时创建的。我使用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}
]

我该如何修复这个问题?我尝试了在一个特定主题中描述的方法,但都没有起作用。


我已经阅读过了,它很相似但并不完全相同。我的情况有所不同。 - RamAlx
3
好的,他们总是这样... 请添加您尝试过的代码。 - Teemu
那应该是字符串还是标识符? - Jonas Wilms
1
你的情况有何不同? - Mukesh Soni
unshift 之前添加 if (! arr.find(e => e.label === 'All' && e.value === 'All')) - baao
显示剩余3条评论
6个回答

99

你可以使用 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);


想要给你一千个赞,但你只能在一个里面管理 :) 。非常感谢这个完美的答案。 - kartik tyagi
如果值(而不是字符串值)等于某些字符串数组,您该如何处理?我需要删除其中重复的字符串并返回arr。 - Gel

25

一行解决方案:

通过 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)

2
v,i,a == 值,索引,数组 - chickens
如果键不按相同顺序排列,则它无法正常工作。 - djcaesar9114

10
这段代码对我有用:
const addresses = [...]; // Some array I got from async call

const uniqueAddresses = Array.from(new Set(addresses.map(a => a.id)))
 .map(id => {
   return addresses.find(a => a.id === id)
 })

这适用于1个属性(id),但不适用于问题所要求的2个属性。 - Laurensius Adi

1
function removeDuplicates(array, key) {
   let lookup = {};
   array.forEach(element => {
     lookup[element[key]] = element
   });
   return Object.keys(lookup).map(key => lookup[key]);
};

removeDuplicates(array,'objectKey');

1
const things = {
  thing: [
    { id: '12345', name: 'First name' },
    { id: '12345', name: 'Second name' },
    { id: '34536', name: 'Third name' }, 
  ],
};

const RemoveDuplicates = (array, key) => {
  return array.reduce((arr, item) => {
    const removed = arr.filter(i => i[key] !== item[key]);
    return [...removed, item];
  }, []);
};

console.log(RemoveDuplicates(things.thing, 'id'));

-2

ES1 兼容:

const a = [
    {label: 'All', value: 'All'},
    {label: 'All', value: 'All'},
    {label: 'Alex', value: 'Ninja'},
    {label: 'Alex', value: 'Ninja'},
    {label: 'Alex', value: 'Ninja'}
]

for (let i = 0; i < a.length; ++i)
    for (let j = 0; j < a.length; ++j)
        if (i !== j && a[i].label === a[j].label && a[i].value === a[j].value)
            a.splice(j, 1);            
console.log(a);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接