【问题标题】:Return object's property if it is found into an array of objects in JavaScript如果在 JavaScript 中的对象数组中找到对象,则返回对象的属性
【发布时间】:2017-08-08 21:03:54
【问题描述】:

我有以下对象数组:

var contacts = [
    {
        "firstName": "Akira",
        "lastName": "Laine",
        "number": "0543236543",
        "likes": ["Pizza", "Coding", "Brownie Points"]
    },
    {
        "firstName": "Harry",
        "lastName": "Potter",
        "number": "0994372684",
        "likes": ["Hogwarts", "Magic", "Hagrid"]
    },
    {
        "firstName": "Sherlock",
        "lastName": "Holmes",
        "number": "0487345643",
        "likes": ["Intriguing Cases", "Violin"]
    },
    {
        "firstName": "Kristian",
        "lastName": "Vos",
        "number": "unknown",
        "likes": ["Javascript", "Gaming", "Foxes"]
    }
];

我想定义一个函数lookUpProfile(firstName, prop),用于输入数据:

lookUpProfile("Akira", "likes");

将返回:

["Pizza", "Coding", "Brownie Points"]

这是我到目前为止的解决方案,直到现在还没有返回:

function lookUpProfile(firstName, prop){
    for(var i = 0; i < contacts.length; i++){
        if(contacts[i].firstName == firstName){
            for(var j = 0; j < contacts[i].length; j++){
                if(contacts[i].hasOwnProperty(prop))
                    return prop;
            }
        }
    }
}

有没有人想办法解决这个问题?谢谢

【问题讨论】:

    标签: javascript arrays javascript-objects


    【解决方案1】:

    您可以尝试这样做。使用 .find() 函数 (ES6) 查找项目并使用括号 [] 语法返回适当的属性。

    var contacts = [
        {
            "firstName": "Akira",
            "lastName": "Laine",
            "number": "0543236543",
            "likes": ["Pizza", "Coding", "Brownie Points"]
        },
        {
            "firstName": "Harry",
            "lastName": "Potter",
            "number": "0994372684",
            "likes": ["Hogwarts", "Magic", "Hagrid"]
        },
        {
            "firstName": "Sherlock",
            "lastName": "Holmes",
            "number": "0487345643",
            "likes": ["Intriguing Cases", "Violin"]
        },
        {
            "firstName": "Kristian",
            "lastName": "Vos",
            "number": "unknown",
            "likes": ["Javascript", "Gaming", "Foxes"]
        }
    ];
    
    function lookUpProfileES6(name, prop){
      var found = contacts.find(item => item.firstName === name);
      if(found){
          return found[prop];
      }
    }
    
    function lookUpProfileES5(name, prop){
      var found = null;
      for(var i = 0; i < contacts.length; i++){
          if(contacts[i].firstName === name){
             found = contacts[i];
             break;
          }
      }
      
      if(found){
          return found[prop];
      }
    }
    
    var resultES6 = lookUpProfileES6("Akira", "likes");
    var resultES5 = lookUpProfileES5("Akira", "likes");
    
    console.log(resultES6);
    console.log(resultES5);

    【讨论】:

      【解决方案2】:

      您的问题是您尝试使用带有数字索引的 for 循环遍历对象。你根本不需要第二个循环。可以很简单

      function lookUpProfile(firstName, prop) {
        for (var i = 0; i < contacts.length; i++) {
          if (contacts[i].firstName === firstName) {
            if (contacts[i].hasOwnProperty(prop)) {
              return contacts[i][prop];
            }
          }
        }
      }
      

      var contacts = [{
          "firstName": "Akira",
          "lastName": "Laine",
          "number": "0543236543",
          "likes": ["Pizza", "Coding", "Brownie Points"]
        },
        {
          "firstName": "Harry",
          "lastName": "Potter",
          "number": "0994372684",
          "likes": ["Hogwarts", "Magic", "Hagrid"]
        },
        {
          "firstName": "Sherlock",
          "lastName": "Holmes",
          "number": "0487345643",
          "likes": ["Intriguing Cases", "Violin"]
        },
        {
          "firstName": "Kristian",
          "lastName": "Vos",
          "number": "unknown",
          "likes": ["Javascript", "Gaming", "Foxes"]
        }
      ];
      
      function lookUpProfile(firstName, prop) {
        for (var i = 0; i < contacts.length; i++) {
          if (contacts[i].firstName === firstName) {
            if (contacts[i].hasOwnProperty(prop))
              return contacts[i][prop];
          }
        }
      }
      
      console.log(lookUpProfile("Akira", "likes"))

      【讨论】:

        【解决方案3】:

        你的代码的问题是这一行:

        for(var j = 0; j < contacts[i].length; j++){
        

        这里没有必要再次尝试迭代。此外,contacts[i] 是一个对象,因此没有长度属性,因此您在比较 0 &lt; undefined 始终为假。

        这会导致您对属性的条件检查永远不会发生。除此之外, prop 是这里的访问器。因此,虽然它可能包含属性名称,但它不包含属性值。为了正确返回属性值,需要在当前对象上以[prop]的形式作为访问器使用。

        去掉第二次迭代,正确访问联系人对象,你的函数就可以正常工作了。

        function lookUpProfile(firstName, prop){
         for(var i = 0; i < contacts.length; i++){
          if(contacts[i].firstName == firstName){
           if(contacts[i].hasOwnProperty(prop))
            return contacts[i][prop];
          }
         }
        }
        

        【讨论】:

          【解决方案4】:

          你可以这样做

          // Create a function which will filter out the requirement
          var filtered = function(name, likes) {
            var _toRet = ''
            contacts.filter(function(elem, index) {
              // check if the first name is same as requires
              // check if the object have property likes
              // Since the requirement is to search the likes array
              if (elem.firstName === name && elem.hasOwnProperty(likes)) {
                _toRet = elem[likes]  
              }
              return _toRet  // return from filter callback
          
            })
          return _toRet  // return from the function
          }
          
          console.log(filtered('Akira', 'likes'))
          

          DEMO

          【讨论】:

            猜你喜欢
            • 2017-11-16
            • 1970-01-01
            • 2016-07-26
            • 2022-01-01
            • 2022-01-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多