我想使用字符串作为要更改的值的路径来控制对象中的值。例如,我有:
let object = { v: 12, o: { v: 15 }}
如果我提供路径:'object.v'
和值:16
,object
将变为:
{ 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/