有一种情况我从外部源提供了一条路径,我需要从对象中提取该密钥并返回该值。
文档架构在设计时也是未知的,因此必须完全灵活。
eval()做我想做的事,但我正在尽职尽责地看看是否有另一种方式。
var obj = {"a": {"b": {"c": 42}, "d": [8,9]}}
var path = 'a.b.c';
eval('obj.' + path);
42
任何人都知道一种方式,没有'eval',我可以使用字符串'a.b.c'来找到obj中的嵌套值吗?
这也必须支持索引到列表中:
var path = 'a.d[1]';
eval('obj.' + path);
9
我可以使用jQuery,如果它提供了一个可行的解决方案,我只是没有看到任何明显的东西。
谢谢!
答案 0 :(得分:2)
递归是这里的解决方案。
function getVal(path, obj){
if(path.length === 1){
return obj[path[0]];
}
else{
return getVal(path, obj[path.shift()]);
}
}
var obj = {"a": {"b": {"c": 42}, "d": [8,9]}};
var path = 'a.b.c';
var val = getVal(path.split('.'), obj);
console.log(val);
这会给你42
。它还不能与'a.d[1]'
一起使用,但可以添加它。
更新:此处有一个适用于'a.d[1]'
的更新版本。:
function getVal(path, obj){
// Get the next "key" in the stack
var key = path.shift();
// Check for bracket notation
if(key.indexOf('[') > -1){
var match = key.match(/(\w+)\[(\d+)\]/);
if(match !== null){
// Get the "next" key
key = match[2];
obj = obj[match[1]];
}
}
// Return the value if done, otherwise, keep going
return path.length === 0 ? obj[key] : getVal(path, obj[key]);
}
var obj = {"a": {"b": {"c": 42}, "d": [8,9]}};
var path = 'a.d[1]';
var val = getVal(path.split('.'), obj);
console.log(val);