4

我正在尝试将字符串"key1.key2"作为对象的属性进行访问。例如 :

var obj = { key1 : {key2 : "value1", key3 : "value2"}};
var attr_string = "key1.key2";

该变量attr_string是嵌套对象中的属性字符串,由".". 它可以是任何深度,例如"key1.key2.key3.key4..."

我想要一些类似的东西obj.attr_string给它的价值obj["key1"]["key2"]"value1"

如何做到这一点?

4

4 回答 4

3

感谢@dfsq 让我记住了eval.

这是我所期待的,一种评估对象字符串属性的简单方法。

var obj = { key1 : {key2 : "value1", key3 : "value2"}};
var attr_string = "key1.key2";

var result = eval("obj."+attr_string);

无需拆分字符串,"."然后将其放入循环中以获取值。eval可以使用 javascript 代码语句评估任何字符串。

于 2013-02-21T13:32:04.367 回答
0

这就是你所追求的吗?

var obj = { key1: { key2A: 'x', key2B: { key3: 'y' } } },
    attr_string = 'key1.key2B.key3',

    find = function ( obj, str ) {

        var index = 0,
            arr = str.split( '.' );

        if ( arr.length ) {
            while ( typeof obj === 'object' &&  arr[ index ] in obj ) {
                obj = obj[ arr[ index ] ];
                index++;
            }
        }

        return obj;

    };


find( obj, attr_string ); // Returns 'y'
于 2013-02-21T12:52:01.633 回答
0
var target = obj;
for (var part in attr_string.split("."))
  target = target[part];
于 2013-02-21T12:24:18.037 回答
0

将@John 的答案固定为可重复使用的函数(我将自己使用)

function nested(obj, attrString){
    var path = attrString.split(".");
    for (var i in path){
        obj = obj[path[i]];
    }
    return obj;
}

// test it out...
x = {a:{b:{c:"happy days"}}};
console.log(nested(x, 'a'));
console.log(nested(x, 'a.b'));
console.log(nested(x, 'a.b.c'));
于 2014-02-05T10:00:46.597 回答