【问题标题】:Javascript nested object lookup, from string, without eval? [duplicate]Javascript嵌套对象查找,从字符串,没有eval? [复制]
【发布时间】:2014-05-01 15:02:52
【问题描述】:

有一种情况,我从外部来源获得了一条路径,我需要将该键从对象中拉出并返回值。

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

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

谢谢!

【问题讨论】:

  • 嗯,是的,这很容易(ish)。解析路径,然后使用括号表示法访问属性。
  • @JonathanLonowski:我喜欢那个问题中的Object.byString 函数:-)
  • 谢谢大家!不知道我怎么错过了另一个类似的问题,但是那里的答案之一,加上下面@RocketHazmat 的答案让我得到了我需要的东西。

标签: javascript jquery


【解决方案1】:

递归是这里的解决方案。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多