使用字符串访问嵌套属性[重复]

Posted

技术标签:

【中文标题】使用字符串访问嵌套属性[重复]【英文标题】:Access a nested property with a string [duplicate] 【发布时间】:2016-01-09 02:03:42 【问题描述】:
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

【问题讨论】:

nameOfPerson = person.name,你可以:phoneToPerson = person.contact.phone 【参考方案1】:

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

【讨论】:

【参考方案2】:

您必须按句点拆分字符串,然后迭代地访问每个节点。这可以通过简单的reduce 来完成:

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

无论str 是否包含句点,上述方法都有效,即namecontact.phone

【讨论】:

【参考方案3】:

您可以通过拆分字符串。 [..] 运算符允许您按名称(和数组项索引)访问对象属性。在嵌套对象的情况下,您只需一个接一个地访问它们。

试试这样:

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

【讨论】:

【参考方案4】:

试试

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

【讨论】:

【参考方案5】:

我知道这篇文章已经很老了,但很奇怪我在这里看不到非常流行的“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

【讨论】:

以上是关于使用字符串访问嵌套属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将具有无效字符的嵌套字段从 Spark 2 导出到 Parquet [重复]

如何使用 SwiftyJSON 从深度嵌套的 JSON 字典中获取字符串 [重复]

使用字符串访问包含属性的数组[重复]

使用点符号字符串访问对象子属性[重复]

遍历嵌套的 JavaScript 对象 [重复]

Python:从字符串访问类属性[重复]