You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:12:03