2013-09-19 3 views
1

У меня есть следующий объектJavascript - получить объект собственности путь

var obj = {}; 
obj.foo = {}; 
obj.foo.bar = "I want this"; 

дал «путь» "foo.bar" в виде строки, как я получить obj.foo.bar (или obj[foo][bar])?

+0

'OBJ [Foo] [бар]' это то, что вы хотите? . Так это сработает для вас –

+0

да, я добавляю, что на вопрос –

+0

вы получаете свойство 'bar' так же, как вы его инициализировали, и назначили строку val ue к нему: 'var myString = obj.foo.bar;' – tikider

ответ

7

Вот способ:

function getKey(key, obj) { 
    return key.split('.').reduce(function(a,b){ 
    return a && a[b]; 
    }, obj); 
} 

getKey('foo.bar', obj); //=> "I want this" 
+0

Приятная идея! Только одно: если одно свойство в «пути» не определено, это вызовет TypeError. Я предлагаю вам улучшить это, изменив 'return a [b]', чтобы возвратить && a [b] '. Таким образом, в этой ситуации getKey возвращает 'undefined', который чувствует себя лучше –

+0

@Tobo: попробуйте с несуществующим ключом, он должен просто вернуть' undefined' as-is. – elclanrs

+0

О, я вижу, если вы вводите два в строке, которые несуществуют, это вызовет ошибку. Ред. – elclanrs

-3

просто использовать obj.foo.bar..that будет работать;

+1

Это не то, что он просит. Он спрашивает, как получить доступ к свойству объекта со строкой «foo.bar». – CharliePrynn

1

если path = "foo.bar" то вы можете написать

var keys = path.split('.'); 
console.log(obj[keys[0]][keys[1]]); 
-1

Другой способ:

function resolve(root, path){ 
    try { 
     return (new Function(
      'root', 'return root.' + path + ';' 
     ))(root); 
    } catch (e) {} 
} 

resolve(obj, 'foo.bar'); // "I want this" 

Подробнее об этом: https://stackoverflow.com/a/18381564/1636522

+2

'new Function' по-прежнему' eval'. – elclanrs

+0

http://stackoverflow.com/a/4599946/1636522 – leaf

+0

Это все еще ** оценено ** ... – elclanrs

Смежные вопросы