Javascript 如何检测对象数组中的重复项?
我想找到重复的对象并添加hasdeplicate:true属性,但不是第一个。方法应该在一个元素之后运行 示例数组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",
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:说得对,伙计。谢谢修好了。您可以安全地删除您的评论,因为它不再相关。