使用字符串访问嵌套属性

时间:2015-10-11 15:35:59

标签: javascript

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

5 个答案:

答案 0 :(得分:5)

您必须按周期拆分字符串,然后迭代访问每个节点。这可以通过简单的reduce

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

无论str是否包含句点,即上述name以及contact.phone,上述内容均有效。

答案 1 :(得分: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);运算符允许您按名称(和数组项索引)访问对象属性。在嵌套对象的情况下,您只需一个接一个地访问它们。

试试这样:



var dynamicType = GetDynamicType() // Gets the Dynamic Type based on runtime values
using (var db = _repositoryFactory.Create()) // Returns ORM to Use
{
    var query = db.GetTable(dynamicType, "_TableName") // Returns an IQueryable<T> where T is the typeof(dynamicType)
    var result = _parser.Parse(request, query) // Applies the grid transformations against the IQueryable (sorting, filtering, paging) and returns the result (raw data from server)
}
&#13;
&#13;
&#13;

答案 2 :(得分:0)

本地,没有。但是有办法做到这一点,比如将字符串分割为.并递归地从person对象下降。通过评估evalnew Function中的完整字符串也可以做到这一点,但出于安全原因,我强烈反对。

答案 3 :(得分:0)

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

答案 4 :(得分: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