首页 > 解决方案 > javascript条件更新内部部分属性而不删除其他属性

问题描述

我以前问过这个问题,但我现在面临一个不同的问题。

我有这些对象:

let oldObj = { 
    test1: 'valueTest1',
    test2: {
        inner1: 'valueInner1',
        inner2: 'valueInner2',
        inner3: {
            otherInner1: 'valueOtherInner1',          
            otherInner2: 'valueOtherInner2'
            }
        },
    test3: 'valueTest3' 
};

let newObj = {
    test2: {
        inner1: 'newValueInner1',
        }
}

并使用此代码:

for (const key of Object.keys(newObj)) {
  if (key in oldObj) {
    oldObj[key] = newObj[key];
  }
}

我得到:

{
    test1:'valueTest1',
    test2: {
        inner1: 'newValueInner1'
        },
    test3:'valueTest3'
}

但我不想删除内部对象的其他属性(inner2、inner3 等)。我希望这个结果:

{ 
    test1: 'valueTest1',
    test2: {
        inner1: 'newValueInner1',
        inner2: 'valueInner2',
        inner3: {
            otherInner1: 'valueOtherInner1',          
            otherInner2: 'valueOtherInner2'
            }
        },
    test3: 'valueTest3' 
}

有没有办法实现这个功能?

这里的对象只是示例,我想要实现的是创建一个函数,可以深度修改对象属性而不删除其余部分。

例如,如果我将 newObj 定义为:

let newObj = {
    test2: {
        inner3: {
            otherInner1:'newValueInner1'
            }
        }
}

我应该得到:

{ 
    test1: 'valueTest1',
    test2: {
        inner1: 'valueInner1',
        inner2: 'valueInner2',
        inner3: {
            otherInner1: 'newValueInner1',          
            otherInner2: 'valueOtherInner2'
            }
        },
    test3: 'valueTest3' 
};

标签: javascript

解决方案


如果您能够使用解构,则可以将值从newObjon 解构oldObj

let oldObj = { 
    test1: 'valueTest1',
    test2: {
        inner1: 'valueInner1',
        inner2: 'valueInner2',
        inner3: {
            otherInner1: 'valueOtherInner1',          
            otherInner2: 'valueOtherInner2'
            }
        },
    test3: 'valueTest3' 
};

let newObj = {
    test2: {
        inner1: 'newValueInner1',
    }
}

for (const key of Object.keys(newObj)) {
  if (key in oldObj) {
    oldObj[key] = {
      ...oldObj[key], // set oldObj[key] to itself
      ...newObj[key]  // override properties from newObj[key]
    }
  }
}

console.log(oldObj)

编辑:正如@riv 指出的,您也可以使用Object.assign

oldObj[key] = Object.assign(oldObj[key], newObj[key]);

推荐阅读