Javascript嵌套对象查找,来自字符串,没有eval?

时间:2014-05-01 15:02:52

标签: javascript jquery

有一种情况我从外部源提供了一条路径,我需要从对象中提取该密钥并返回该值。

文档架构在设计时也是未知的,因此必须完全灵活。

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,如果它提供了一个可行的解决方案,我只是没有看到任何明显的东西。

谢谢!

1 个答案:

答案 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);