这似乎是显而易见的,但我无法弄清楚如何在代码中的多个位置缩短更改深度嵌套对象值,而无需重新输入每次键到此值的路径:
> obj = { 'key1': { 'key2': { 'key3': { 'key4': { 'key5': 'value' }}}}}
> obj.key1.key2.key3.key4.key5
'value'
> obj.key1.key2.key3.key4.key5 = 'changeme'
> obj.key1.key2.key3.key4.key5
'changeme'
> obj.key1.key2.key3.key4.key5 = 'changeme2'
> obj.key1.key2.key3.key4.key5
'changeme2'
答案 0 :(得分:2)
您可以将最里面的对象分配给变量。
var foo = obj.key1.key2.key3.key4;
从那开始,访问/修改foo.key5
将等同于访问/修改obj.key1.key2.key3.key4.key5
。
foo.key5 = 'new value'
console.log(obj.key1.key2.key3.key4.key5); // 'new value'
答案 1 :(得分:2)
您可以使用一些递归来迭代对象中的每个键,并更新它找到匹配键的位置。
const obj = { 'key1': { 'key2': { 'key3': { 'key4': { 'key5': 'value' }}}, 'key5': 'test'}}
const mutateObjectProperty = (prop, value, obj) =>
obj.constructor === Object && Object.keys(obj).forEach(key => {
if (key === prop) obj[key] = value
mutateObjectProperty(prop, value, obj[key])
})
mutateObjectProperty('key5', 'updated', obj)
console.log(obj)
答案 2 :(得分:0)
您可以使用JSON.stringify()
,JSON.parse()
,String.prototype.replace()
。您还可以使用仅检查属性名称的RegExp
,而不是属性名称和值。
var obj = { 'key1': { 'key2': { 'key3': { 'key4': { 'key5': 'value' }}}}}
function updateObject(obj, key, val, value) {
return JSON.parse(JSON.stringify(obj)
.replace(new RegExp(`"${key}":"${val}"`), `"${key}":"${value}"`))
}
obj = updateObject(obj, "key5", "value", "changeme");
console.log(obj);