【问题标题】: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

标签: javascript


【解决方案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

          【讨论】:

            猜你喜欢
            • 2019-03-02
            • 1970-01-01
            • 2017-08-21
            • 2021-11-03
            • 2017-07-27
            相关资源
            最近更新 更多