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

如何用JavaScript扩展运算符实现对象数组的ID匹配增改单行方案?

实现数组对象的新增/替换(按ID匹配)

示例代码

let arr = [
  {id: 1, data: {foo: "bar 1"}},
  {id: 2, data: {foo: "bar 2"}}
];

// 当ID不存在时,作为新元素添加到数组
arr = [...arr, {id: 3, data: {foo: "bar 3"}}]
console.log(arr);

// 当ID存在时,替换对应对象的data(当前写法只会新增,不会替换)
arr = [...arr, {id: 2, data: {foo: "new data object"}}]
console.log(arr);

// 期望输出:
[
  {id: 1, data: {foo: "bar 1"}},
  {id: 2, data: {foo: "new data object"}},
  {id: 3, data: {foo: "bar 3"}}
]

问题说明

如上述代码所示,直接使用扩展运算符仅能新增元素,即使ID重复也不会替换原有对象。需要一种单行实现方式:传入对象时,若数组中已有相同ID的对象则替换它,若无则添加为新元素(已知可通过arr.find(i => i.id == newObject.id)判断后分情况处理,但希望用单行代码解决)。

单行解决方案

方案1:过滤后合并(适用于单个对象操作)

arr = [...arr.filter(item => item.id !== newObject.id), newObject];

逻辑说明:先通过filter移除原数组中与新对象ID匹配的元素(如果存在),再用扩展运算符将过滤后的数组与新对象合并。原数组有匹配ID时,旧元素被过滤掉,新对象补上实现替换;无匹配ID时,直接追加新对象。

方案2:利用Map去重(适用于批量对象操作)

如果需要一次性处理多个对象,这个方案更高效:

// 假设newObjects是包含多个待添加/替换对象的数组
arr = [...new Map([...arr, ...newObjects].map(item => [item.id, item])).values()];

逻辑说明:将原数组和待处理对象数组合并后,把每个元素转换为[对象ID, 对象]的键值对,传入Map构造函数——Map会自动用新值覆盖相同键的旧值,最后通过values()提取所有对象并转回数组。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:43:40