Javascript 如何检测对象数组中的重复项?

Javascript 如何检测对象数组中的重复项?,javascript,arrays,object,ecmascript-6,Javascript,Arrays,Object,Ecmascript 6,我想找到重复的对象并添加hasdeplicate:true属性,但不是第一个。方法应该在一个元素之后运行 示例数组 items: [ { checked: false, desc: "", id: "396", value: "Lorem", }, { checked: false, desc: "", id: "230",

我想找到重复的对象并添加hasdeplicate:true属性,但不是第一个。方法应该在一个元素之后运行

示例数组

 items: [
  {
    checked: false,
    desc: "",
    id: "396",
    value: "Lorem",
  },
  {
    checked: false,
    desc: "",
    id: "230",
    value: "Lorem"
  },
  {
    checked: false,
    desc: "",
    id: "396",
    value: "Lorem",
    hasDuplicate: true
  },
  {
    checked: false,
    desc: "",
    id: "396",
    value: "Lorem",
    hasDuplicate: true
  },
  {
    checked: false,
    desc: "",
    id: "230",
    value: "Lorem",
    hasDuplicate: true
  },
]

使用ES6检测阵列中重复项的有效方法是什么?

这将根据每个重复项的id设置每个重复项的hasDuplicate属性,但第一个重复项除外

items.forEach((d, i) => {
  if(i == items.map(d => d.id).indexOf(d.id)) {
    d.hasDuplicate = true;
  }
})

使用
Array.prototype.map()
遍历数组,并检查是否已看到
散列(
对象.entries()
连接):

const src=[{checked:false,desc:,id:“396”,value:“Lorem”,},{checked:false,desc:,id:“230”,value:“Lorem”},{checked:false,desc:,id:“396”,value:“Lorem”},{desc desc:,id:“230”,checked:false,value:“Lorem”},value:“Lorem”,
重复数据消除=(a,hashMap=[])=>a.map(o=>{
常量哈希=对象
.条目(o)
.sort(([a],[b])=>
a、 本地比较(b))
.flat()
.join(“\ud8ff”)
return!hashMap.includes(散列)?
(hashMap.push(散列),o):
{…o,hasDuplicate:true}
})
console.log(重复数据消除(src))
.as控制台包装{min height:100%;}
isIdentical()方法将比较两个对象,如果它们相同,则返回true

 const isIdentical = (obj1, obj2) => {
      let flag = true;
      Object.keys(obj1).forEach(key => {
        if(obj1[key] !== obj2[key]){
          flag = false;
          return false;
        }
      });
      return flag;
    };
现在reduce方法将帮助我们遍历数组

items.reduce((unique, item) => {
  const index = unique.findIndex( u => isIdentical(u, item));
  if(index < 0){
    return [...unique, item];
  } else {
    item.hasDuplicate = true;
    return unique;
  }
}, []);

console.log(items);
items.reduce((唯一,item)=>{
const index=unique.findIndex(u=>isidential(u,item));
如果(指数<0){
返回[…唯一,项目];
}否则{
item.hasdeplicate=true;
返回唯一值;
}
}, []);
控制台日志(项目);

你尝试过什么,它到底有什么问题?给出一组通常不需要太多翻译的代码。做一些研究
Array.prototype.filter或reduce
或者只使用
进行循环我认为很清楚,正如第一个答案中所示。这似乎是一个不错的解决方案,它正在工作,但Include对ie11等浏览器的支持较差,也许我可以使用indexOf,对吗?@ÖmerDoğan:刚刚签入ie11,它似乎返回了预期的结果properly@Thomas:说得对,伙计。谢谢修好了。您可以安全地删除您的评论,因为它不再相关。