JavaScript基于ID去除对象数组重复项并覆盖address属性实现方案
对象数组按ID去重实现方案
首先修正你给出的输入数据的语法问题(address缺少嵌套大括号、部分数组项之间缺逗号),以下是可直接运行的实现:
实现思路
- 用
Map结构存储已处理的ID对应对象,天然支持键去重,且能保留ID首次出现的顺序,匹配预期输出的排序规则 - 遍历原数组时,首次出现的ID直接存入Map;重复ID仅在新的address.city为非空/非全空格时覆盖已有值(完全匹配你给出的预期结果,若不需要空值判断可直接删除对应判断逻辑)
实现代码
const data = [ { id: 123, name: "dave", age: 23, address: { city: "chennai" } }, { id: 456, name: "chris", age: 23, address: { city: "delhi" } }, { id: 789, name: "bob", age: 23, address: { city: "" } }, { id: 789, name: "bob", age: 23, address: { city: "mumbai" } }, { id: 555, name: "dave", age: 23, address: { city: "banglore" } }, { id: 101, name: "tom", age: 23, address: { city: "jaipur" } }, { id: 101, name: "tom", age: 23, address: { city: " " } }, { id: 102, name: "tim", age: 23, address: { city: "kolkata" } } ]; const idMap = new Map(); data.forEach(item => { if (idMap.has(item.id)) { // 去掉该if判断即可实现后出现的address无论是否为空都直接覆盖前值 if (item.address.city.trim()) { idMap.get(item.id).address.city = item.address.city; } } else { // 如果不需要修改原数组对象,可改为浅拷贝:idMap.set(item.id, {...item, address: {...item.address}}) idMap.set(item.id, item); } }); const uniqueData = Array.from(idMap.values()); console.log(uniqueData);
输出结果
和你给出的预期完全一致:
[ { id: 123, name: 'dave', age: 23, address: { city: 'chennai' } }, { id: 456, name: 'chris', age: 23, address: { city: 'delhi' } }, { id: 789, name: 'bob', age: 23, address: { city: 'mumbai' } }, { id: 555, name: 'dave', age: 23, address: { city: 'banglore' } }, { id: 101, name: 'tom', age: 23, address: { city: 'jaipur' } }, { id: 102, name: 'tim', age: 23, address: { city: 'kolkata' } } ]
内容的提问来源于stack exchange,提问作者Santhana Krishna
相关产品推荐
相关产品推荐

