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
相关产品推荐
相关产品推荐

