深度更改嵌套对象值

时间:2017-06-06 05:19:03

标签: javascript node.js object

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

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

3 个答案:

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