【问题标题】:How to modify nested value with a single variable as multiple keys如何使用单个变量作为多个键修改嵌套值
【发布时间】:2021-05-14 17:39:48
【问题描述】:

假设我有一个这样的字典(这只是示例数据):

obj = {
    name: 'John',
    properties: {
       age: 42,
       address: 'somewhere'
    }
}

如果我想修改由变量指定的任意深度的值,该怎么办?

对于深度 1,它将是直接的:

obj[what_to_modify] = new_value

但深度 > 1?

what_to_modify="properties.age"
obj[what_to_modify.split('.')] = new_value
// I KNOW, THIS DOESN'T WORK, IT JUST
// ILLUSTRATES WHAT I WANT TO ACHIEVE

我的解决方案是像这样做一个 foor lop:

let levels = what_to_modify.split('.')
let it = obj
for(let k=0; k < levels.length; k++){
    let key = levels[k]
    if(k == levels.length -1){
        it[key] = new_value
    }else{
        it = it[key]
    }
}

这已经可行,但我想知道:有没有更简单的方法来做到这一点?


说清楚,我不想只读取值,我想修改它,所以Accessing nested JavaScript objects and arrays by string pathAccess property via it's keyPath in Javascript? 不能解决我的问题


重要

接受的答案使用 lodash,但实际上我不应该在我的项目中包含新的依赖项,所以如果 vanilla JS 有任何其他方式,我会将接受的答案更改为。

【问题讨论】:

标签: javascript dictionary


【解决方案1】:

您可以使用lodash_.set 按路径设置值,_.get 按路径返回值。 _.toPath 将字符串转换为路径数组。

const obj = {
    name: 'John',
    properties: {
       age: 42,
       address: 'somewhere'
    }
};

const propertiesAgePath = _.toPath('properties.age');
console.log(_.get(obj, propertiesAgePath));
_.set(obj, propertiesAgePath, 43);
console.log(_.get(obj, propertiesAgePath));
_.set(obj, _.toPath('properties.address'), 'new address');
console.log(obj);
&lt;script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"&gt;&lt;/script&gt;

【讨论】:

  • 我要赞成并接受,但实际上我不应该在我正在处理的项目中包含新的依赖项,所以如果有任何其他答案可以在没有 lodash 的情况下为我做到这一点,我将不得不改变它。还是谢谢
  • @Miguel 很遗憾有这么多人坚持重新发明轮子。这是一个已解决的问题,lodash 有很多有用的工具,我将它添加到我正在从事的大多数项目中。它非常适合深度克隆、创建范围、复杂的对象修改......
【解决方案2】:

您也可以小心使用 eval 来完成此操作。

let new_value = 9

obj = {
    name: 'John',
    properties: {
       age: 42,
       address: 'somewhere'
    }
}

what_to_modify="properties.age"

eval("obj."+what_to_modify+"= new_value")

console.log(obj)

【讨论】:

  • 我不会在我的代码中包含 eval,但感谢您抽出宝贵时间来回答。
  • eval 是危险的,这取决于你放在那里的东西。了解您不想使用它的愿望。
  • 不仅危险而且速度慢。它可以很容易地替换为性能更好的函数。
猜你喜欢
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多