如何获取对象数组中重复值的ID及被删除的重复对象集合
按指定字段去重对象数组并提取重复元素
我有一段JavaScript代码,能按id、Light、type三个字段对对象数组进行去重,运行效果正常:
var data = [ {"id":"1","Group":"Wohnzimmer","Light":"Diele", "type":"ct"}, {"id":"1","Group":"Wohnzimmer","Light":"Diele", "type":"ct"}, {"id":"2","Group":"Wohnzimmer","Light":"Diele", "type":"bri"}, {"id":"3","Group":"Wohnzimmer","Light":"Diele", "type":"color"}, {"id":"3","Group":"Wohnzimmer","Light":"Diele", "type":"color"}, ] var a = data.reduce((accumulator, current) => { if (checkIfAlreadyExist(current)) { return accumulator; } else { return [...accumulator, current]; } function checkIfAlreadyExist(currentVal) { return accumulator.some((item) => { return (item.id === currentVal.id && item.Light === currentVal.Light && item.type === currentVal.type); }); } }, []); console.log(a);
原代码运行后得到的去重结果:
[{ Group: "Wohnzimmer", id: "1", Light: "Diele", type: "ct" }, { Group: "Wohnzimmer", id: "2", Light: "Diele", type: "bri" }, { Group: "Wohnzimmer", id: "3", Light: "Diele", type: "color" }]
现在需要同时获取被剔除的重复对象集合,期望结果如下:
[{ Group: "Wohnzimmer", id: "1", Light: "Diele", type: "ct" },{ Group: "Wohnzimmer", id: "3", Light: "Diele", type: "color" }]
修改方案
可以调整reduce的累加器结构,同时存储去重后的数组和重复元素数组,具体代码如下:
var data = [ {"id":"1","Group":"Wohnzimmer","Light":"Diele", "type":"ct"}, {"id":"1","Group":"Wohnzimmer","Light":"Diele", "type":"ct"}, {"id":"2","Group":"Wohnzimmer","Light":"Diele", "type":"bri"}, {"id":"3","Group":"Wohnzimmer","Light":"Diele", "type":"color"}, {"id":"3","Group":"Wohnzimmer","Light":"Diele", "type":"color"}, ] const { uniqueItems, duplicates } = data.reduce((acc, current) => { const exists = acc.uniqueItems.some(item => item.id === current.id && item.Light === current.Light && item.type === current.type ); if (exists) { acc.duplicates.push(current); } else { acc.uniqueItems.push(current); } return acc; }, { uniqueItems: [], duplicates: [] }); console.log('去重结果:', uniqueItems); console.log('重复元素:', duplicates);
代码说明
- 累加器初始化为包含
uniqueItems(存储去重后元素)和duplicates(存储重复元素)的对象 - 遍历每个元素时,检查是否已存在于
uniqueItems中 - 若存在则将当前元素加入
duplicates数组,否则加入uniqueItems数组 - 最后通过解构赋值分别获取两个结果数组
运行后duplicates数组就是需要的被删除的重复对象集合。
内容的提问来源于stack exchange,提问作者Markus Hartmann
相关产品推荐
相关产品推荐

