JavaScript中如何将JSON响应合并到已初始化对象仅覆盖同名字段
JavaScript对象定向覆盖实现方案
你的需求本质是仅对Y对象已有的属性,用X对象的同名属性值覆盖,完全不新增X独有的属性,原生JS可以非常简单的实现,不需要复杂的自定义映射逻辑。
浅覆盖实现(一级属性直接替换)
如果你的属性都是一级,或者嵌套对象允许直接整体替换,用几行代码即可实现:
// 遍历Y的所有自有属性,仅覆盖X中存在的同名属性 Object.keys(y).forEach(key => { if (x.hasOwnProperty(key)) { y[key] = x[key] } })
该方法直接修改原Y对象,性能极高,即使属性数量很多也不会有性能问题。
深度合并实现(嵌套对象递归合并)
如果你需要保留Y的嵌套对象结构,只递归覆盖嵌套内部的同名属性,可以用递归实现:
function mergeTargetBySource(target, source) { Object.keys(target).forEach(key => { // 源对象不存在该属性直接跳过 if (!source.hasOwnProperty(key)) return const targetVal = target[key] const sourceVal = source[key] // 两边都是非null对象时递归合并 if (typeof targetVal === 'object' && targetVal !== null && typeof sourceVal === 'object' && sourceVal !== null) { mergeTargetBySource(targetVal, sourceVal) } else { // 其他情况直接覆盖 target[key] = sourceVal } }) } // 调用方法,直接修改原y对象 mergeTargetBySource(y, x)
补充说明
- 如果需要保留原Y对象不被修改,可以先对Y做深拷贝后再执行上述合并逻辑。
- 如果有特殊覆盖规则(比如X的属性值为null/undefined时不覆盖),在赋值前增加对应判断条件即可。
内容的提问来源于stack exchange,提问作者erdemgonul
相关产品推荐
相关产品推荐

