我想使用字符串作为要更改的值的路径来控制对象中的值。例如,我有:
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的路径为不受此变化的影响。还有其他建议吗?
答案 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' } } }