2015-10-11 2 views
2
var person = { 
    name: 'Joe', 
    contact: { 
    phone: '555' 
    } 
} 

var nameOfPerson = person['name']; //Joe 

var str = 'contact.phone'; 
var phoneToPerson = person[str]; //undefined 

Можно ли как-нибудь это сделать? Я получил некоторую логику, где заканчиваю строку, и мне нужно получить доступ к вложенному свойству.Доступ к вложенной собственности со строкой

https://jsbin.com/xehokozaco/edit?js,console

+0

в то время как 'nameOfPerson = person.name', вы можете:' phoneToPerson = person.contact.phone ' –

+2

Возможный дубликат [Доступ к вложенным объектам JavaScript со строковым ключом] (http://stackoverflow.com/questions/6491463/accessing-nested-javascript-objects-with-str ING-ключ) – Mathletics

ответ

5

Вам придется разделить строку на период, а затем получить доступ к каждому узлу итеративно. Это может быть сделано в простом reduce:

var value = str.split('.').reduce(function(p,prop) { return p[prop] }, person); 

выше будет работать независимо, если str содержит период или нет, то есть для name, а также contact.phone.

0

Врожденная, нет. Однако есть способ сделать это, например, разбить строку на . и рекурсивно спуститься с объекта person. Также можно оценить полную строку в eval или new Function, но я сильно обескураживаю из соображений безопасности.

1

Вы можете, разделив строку. оператор [..] позволяет вам получить доступ к свойствам объекта по имени (и индексу элементов массива). В случае вложенных объектов вы просто обращаетесь к ним один за другим.

Попробуйте так:

var person = { 
 
    name: 'Joe', 
 
    contact: { 
 
    phone: '555' 
 
    } 
 
} 
 

 
var nameOfPerson = person['name']; //Joe 
 

 
var str = 'contact.phone'; 
 

 
var phoneToPerson = str.split('.').reduce(function(o, key) { 
 
    return o[key]; 
 
}, person); 
 

 
alert(phoneToPerson);

0

попробовать

var select = "contact.phone"; 
var value = person; 
select.split(".").forEach(function(val){ 
    value = value[val]; 
}); 
console.log(value); 
0

Я знаю, что этот пост довольно старый, но его странно я не могу видеть очень популярный решение "Lodash" здесь, который позволяет получить объектные вложенные свойства безопасно.

Пример:

var object = { 
    a: [ 
     { 
     b: { 
      c: 3 
     } 
     } 
    ] 
}; 

_.get(object, 'a[0].b.c'); // → 3 

Для примера:

var person = { 
    name: 'Joe', 
    contact: { 
    phone: '555' 
    } 
} 

var personPhoneProp = 'contact.phone'; 

_.get(person, personPhoneProp); // -> '555' 

Документация: https://lodash.com/docs#get

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