javascript - 如何使用类似字符串的路径更改 JavaScript 对象?

标签 javascript

我想使用字符串作为要更改的值的路径来控制对象中的值。例如,我有:

let object = { v: 12, o: { v: 15 }}

如果我提供路径:'object.v'值:16object将变为:

{ v: 16, o: { v: 15 }}

如果我提供路径:'object.o.v'值:8<​​object变为:

{ v: 16, o: { v: 8 }}

路径也可以指向一个对象,例如'object.o'
如果路径指向不存在的变量,该函数将创建它并创建父变量,例如 'object.o.o2.o3'

实际上,我知道如何使用 for 循环来做到这一点,只需创建结构并更改最后一个面包屑上的值,但我想知道 Javascript 是否提供了简单的函数来执行此操作。

或者这是我如何使用 for 循环实现它

let object = { v: 12, o: { v: 15 }}

function update (path, value) {

  const crumbs = path.split('.');
  let currentCrumb = object;

  let i;
  for (i = 1, count = crumbs.length; i < count - 1; ++i) {
    if (currentCrumb[crumbs[i]] === undefined) {
      currentCrumb[crumbs[i]] = {};
    }
    currentCrumb = currentCrumb[crumbs[i]];
  }

  currentCrumb[crumbs[i]] = value;
}

// usage
update('object.o.v', 51);
// object is now { v: 12, o: { v: 51 }}

JavaScript 没有提供一些有用的函数来使用路径或其他东西来更新对象吗?或者你会用什么方法来解决这个问题?

谢谢

更新:
有人告诉我使用eval,问题是value可以是一个对象,正如我所说。因此,编写 eval(path + '=' + value) 是无效的,当值是对象时我可以使用 JSON.stringify(value) 但引用会丢失,这意味着如果 value 在其他地方发生更改,则评估的路径不会受到此更改的影响。还有其他建议吗?

最佳答案

这可以通过 lodash 来完成库,他们称之为“属性路径数组”。

> _ = require('lodash')
> object = { v: 12, o: { v: 15 }}
{ v: 12, o: { v: 15 } }
> _.at(object, ['o.v'])
[ 15 ]
> _.set(object, 'o.v', 16)
{ v: 12, o: { v: 16 } }
> _.set(object, 'o.o2.o3', 'foo')
{ v: 12, o: { v: 16, o2: { o3: 'foo' } } }

关于javascript - 如何使用类似字符串的路径更改 JavaScript 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46367928/

相关文章:

javascript - 折线图自动缩放

javascript - slider 中的 .css() 方法不起作用

javascript - 添加 css 以验证字段

javascript - 有什么方法可以使用 Javascript 获取/设置视频或 Flash 对象的低音和高音?

javascript - 没有Jquery的ajax中的文本链接

javascript - iphone6 上的 html5-canvas 无法正确缩放

javascript - onchange 属性在非传统元素中是否有效?

javascript - 如果目标文件不存在,则在 Node.js 中异步重命名文件

javascript - Ajax 在第二次调用时不接收数据

javascript - 通过名称(字符串)执行类内的私有(private)函数