我想使用类似于此"a.0.b"
的路径字符串为JSON设置值,以获得如下所示的JSON:
{
a: [
{
b: 'c'
}
]
}
我提出了这个解决方案,但我想知道是否有更简单的方法来写这个:
function setValue(path, value, json) {
var keys = path.split('.');
_.reduce(keys, function(obj, key, i) {
if (i === keys.length - 1) {
obj[key] = value;
} else {
return obj[key];
}
}, json);
}
所以调用setValue('a.0.b', 'd', {a:[{b:'c'}]})
会将json更改为{a:[{b:'d'}]}
答案 0 :(得分:4)
这是一个解决方案。我对两种可能的解决方案进行了基准测试,看起来循环遍历对象和路径比使用reduce函数更快。请参阅此处的JSPerf测试:http://jsperf.com/set-value-in-json-by-a-path-using-lodash-or-underscore
function setValue(path, val, obj) {
var fields = path.split('.');
var result = obj;
for (var i = 0, n = fields.length; i < n && result !== undefined; i++) {
var field = fields[i];
if (i === n - 1) {
result[field] = val;
} else {
if (typeof result[field] === 'undefined' || !_.isObject(result[field])) {
result[field] = {};
}
result = result[field];
}
}
}