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

时间:2017-09-22 15:10:44

标签: javascript

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

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

如果我提供path: 'object.v'value: 16,则object会变为:

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

如果我提供path: 'object.o.v'value: 8,则object会变为:

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

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

实际上我知道如何使用for循环来创建结构并更改最后一个crumb上的值,但是我想知道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在其他位置发生更改,则eval的路径为不受此变化的影响。还有其他建议吗?

1 个答案:

答案 0 :(得分:2)

这可以使用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' } } }