2015-09-22 5 views
0

У меня есть JavaScript Object, что-то вроде этого:Доступ сложного объекта Javascript динамически

var obj = { simpleName: "some name" name: { firstName: "anudeep", lastName : "rentala" }, address: { country: "XZ", state:"DF" } } 

У меня также есть другой объект, как это:

var foo = { loc = "name.firstName" } 

В зависимости от значения foo.loc, я бы для доступа к значению в объекте obj. В этом случае мне нужно будет получить доступ к obj.name.firstname. Так далеко, я пытался что-то вроде этого:

var props = foo.loc.split("."); 
    for(var prop in props) 
    { 
     if (obj.hasOwnProperty(prop)) 
     { 
      alert(obj[prop]) 
     } 
    } 

Моя проблема, теперь я могу получить доступ только name свойство из obj объекта, как я шагаю в него, как name.firstName, я знаю что obj[name][firstName] будет работать, но как мне это сделать динамически? Как продлить это obj["prop1"]["prop2"]["prop3"] . .. .["propn"]

+0

'Foo' длина массива определяют как глубоко вы должны идти в var 'obj'. Цикл for выполнит эту работу. – nespapu

+0

Возможно, просто добавьте указатель obj к следующему значению, например obj = obj [prop] – gba

+0

Эй, @ Andreas, этот вопрос также отвечает на мой вопрос. Благодарю. –

ответ

1

Есть несколько отсутствующий , и firstname против firstName, но если вы исправить их, то это прекрасно работает:

var obj = { simpleName: "some name", name: { firstName: "anudeep", lastName : "rentala" }, address: { country: "XZ", state:"DF" } } 
var foo = { loc: "name.firstName" } 
var props = foo.loc.split("."); 
var output = props.reduce(function(prev,prop) { 
    if (prev.hasOwnProperty(prop)) { 
    return prev[prop] 
    } else { 
    // however you want to handle the error ... 
    } 
}, obj); 
alert(output); 
+0

Спасибо, я нашел это более элегантным, чем связанный ответ. –

0

Вы можете исправить свой код, как это:

var props = foo.loc.split("."); 
var current = obj; 
for(var prop in props) 
{ 
    if (current.hasOwnProperty(prop)) 
    { 
    current = current[prop]; 
    alert(current) 
    } 
} 

но это, вероятно, не будет очень полезным, как только вы начинаете иметь более сложные «селекторы», например, с использованием массивов ("names[2].firstname").

+0

Спасибо, foo.loc.split ("."); был отредактирован назад. Но в любом случае это не проблема. распространите его на obj ["prop1"] ["prop2"] ["prop3"]. .. ["propn"] есть. –

0

Вот функция:

var obj = { simpleName: "some name", name: { firstName: "anudeep", lastName : "rentala" }, address: { country: "XZ", state:"DF" } }; 
var foo = { loc: "name.firstName" }; 

var checkObj = function(obj, props) { 

    var temp = obj; 

    for(var i = 0, len = props.length; i < len; i++) { 
     if(temp.hasOwnProperty(props[i])) { 
      temp = temp[props[i]]; 
     } 
     else return false; 
    } 
    return temp; 
}; 

console.log(checkObj(obj, foo.loc.split('.'))); 
Смежные вопросы