2017-06-06 257 views
0

这似乎是显而易见的,但我无法弄清楚如何缩短改变在代码中的多个位置深度嵌套对象的值,无需重新键入每次关键路径,这个值:更改深度嵌套对象值

> 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' 
+1

'变种X =如果你想要一个纯粹的命令行的解决方案obj.key1.key2.key3.key4' ......然后更改'x.key5' –

+0

,只是按向上箭头。否则,只需存储对'let ref = obj.key1.key2.key3.key4;'的引用并使用'ref.key5 ='changeme3';' –

+0

添加到@JaromandaX注释中,原因是这会起作用是因为您正在分配一个东西。对象使用引用进行分配。因此,在一个地方的变化将反映到处。但是如果你设置'x = ... key5',它不会像原始类型被值 – Rajesh

回答

1

你可以最里面的对象分配给一个变量。

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' 
+0

虽然这已在评论中解决,请添加说明如何工作,为什么不分配'x'直到'key5' – Rajesh

+0

感谢您的答案。标记为已接受。 –

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);

1

你可以使用一些递归的在你的对象,并更新它找到一个匹配的钥匙每个键遍历。

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)