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

Remove duplicate values from an array of objects in javascript [duplicate]

提问人:RamAlx 提问时间:8/1/2017 最后编辑:Mukesh SoniRamAlx 更新时间:4/9/2022 访问量:94270

问:

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

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

这个数组是在渲染我的 react 组件时组成的。用于在数组顶部添加所需元素的 i 用户。 所以我写.当我的组件第一次渲染时,我的数组已成功创建。但是当我重新渲染它时,它向我显示了值为重复的数组。更具体地说,它显示如下内容:Array.prototype.unshiftarr.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}
]

我该如何解决这个问题?我在这里尝试了特定主题中描述的方法,但没有奏效

JavaScript 数组 重复项

评论

0赞 RamAlx 8/1/2017
我读过这篇文章,它是相似的,但并不完全重复。我的情况不同
3赞 Teemu 8/1/2017
是的,当然,他们总是......请添加您尝试过的代码。
0赞 Jonas Wilms 8/1/2017
那应该是什么字符串或标识符?
0赞 RamAlx 8/1/2017
是的,它们是字符串,只是想展示我面临的情况
1赞 Mukesh Soni 8/1/2017
您的情况有何不同?

答:

99赞 Hassan Imam 8/1/2017 #1

您可以使用 和 。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);

评论

0赞 kartik tyagi 8/31/2021
想给 1k 个赞,但你必须在 1 :)内管理。好吧,谢谢你这个完美的答案
0赞 Gel 11/3/2022
如果值(而不是字符串值)等于一些字符串数组,哟该怎么做?我需要删除其中重复的字符串并返回 arr ?
25赞 chickens 10/18/2019 #2

单衬垫解决方案:

唯一 和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赞 chickens 4/9/2022
v,i,a == 值、索引、数组
0赞 djcaesar9114 7/24/2022
如果键的顺序不同,则不起作用。
1赞 Azhar 12/31/2019 #3
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'));
1赞 Ali Akbar 4/4/2020 #4
function removeDuplicates(array, key) {
   let lookup = {};
   array.forEach(element => {
     lookup[element[key]] = element
   });
   return Object.keys(lookup).map(key => lookup[key]);
};

removeDuplicates(array,'objectKey');
10赞 Anusha Bhat 7/4/2020 #5

这段代码对我有用,

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)
 })

评论

0赞 Laurensius Adi 9/21/2022
这适用于 1 个属性 (id),但不适用于 2 个问题。
-2赞 Locoder 7/25/2020 #6

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);