javascript - 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'
};
解决方案
如果您能够使用解构,则可以将值从newObj
on 解构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]);
推荐阅读
- elasticsearch - Elasticsearch '[bool] 无法解析字段 [filter]' 异常
- c - 尝试执行 ioctl 时出现一般保护错误
- c - 两个给定整数的不同位
- kernel - 内核中 MMU 上下文中的 PMM 竞技场是什么(锆石/紫红色)
- ios - 获取周开始日不同于星期一的周数 - IOS
- python - Python pp 一个 Json 配置文件
- javascript - 从 react-redux 中的元素中删除事件监听器的问题
- gem5 - gem5 中 regStats() 函数的输出存储在哪里?
- xpath - 使用 wso2 esb 更改原始有效负载
- logstash - docker 中的 logstash 错误“无法执行操作”