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

JavaScript中如何实现Object.assign式对象合并不覆盖原有字段?

问题描述

是否存在方法可以实现类似Object.assign(a, b)的两个对象合并效果,但合并时a中的同名字段保留原始值,不会被b的对应字段覆盖?

参考示例:

a = {x: 1, y: 2}
b = {y: 3, z: 4}

Object.assign(a, b)
// 执行上述代码后得到 a = {x: 1, y: 3, z: 4},预期实现效果为 {x: 1, y: 2, z: 4}
console.log(a) 

核心要求:

  • 直接修改原对象a
  • 实现代码简洁不冗余
  • 执行性能优异无额外开销
最优实现

直接遍历b的自有可枚举属性,仅当a不存在对应属性时完成赋值即可,没有任何中间开销:

for (const key in b) {
  if (Object.hasOwn(b, key) && !(key in a)) {
    a[key] = b[key]
  }
}

方案说明

  • 该写法和Object.assign行为逻辑对齐,只会处理b自身的可枚举属性,不会误拷贝原型链上的属性
  • 全程没有创建额外的中间对象、中间数组,遍历过程直接操作原对象a,性能表现最优
  • 代码逻辑直白,没有冗余的API嵌套,可读性强
  • 完全满足需求:a原有字段值不会被覆盖,仅追加b中独有的字段,执行后a的结果正好是预期的{x: 1, y: 2, z: 4}

注意不要用需要拷贝备份、创建中间对象的取巧写法,这类方案要么会额外占用内存,要么会意外修改源对象b,不符合性能和逻辑要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:51:46