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

文字列をで分割して"."からループに入れて値を取得する必要はありません。evaljavascriptコードステートメントで任意の文字列を評価できます。

于 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 に答える