迭代javascript对象数组的不同方法?

时间:2016-01-13 07:20:23

标签: javascript

如果这是一个愚蠢的问题,请忽略。我刚刚提出了自己的问题解决方案,但我知道这不是一个好的解决方案,并且有更好的智能方法可以做到这一点,如果你有其他只使用javascript的解决方案,请回答。

它要求创建一个循环遍历对象数组的函数,并在firstName与配置文件匹配时返回对象的prop。如果firstName或prop提供给未找到的函数,则返回一些语句。



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

    for (var i = 0; i < contacts.length; i++){  
            var n = parseInt(contacts.length);

        
            if (contacts[i].firstName === firstName)    {
            
                if (contacts[i].hasOwnProperty(prop)){
                    return contacts[i][prop];
                }
                else return "No such property";
                }
            else if (i === (n-1)) {
                return "No such contact";
            }
    }
}

console.log(lookUp("Sherlock", "likes"));    
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:2)

  • contacts.length是一个整数,而不是字符串,因此不需要parseInt

  • 您实际上并不需要else if:您可以将它放在循环之外,因为如果联系人存在,您就已经退出了该功能。这也使n变得不必要,第一点没有用。

  • 一般来说,返回错误消息是个坏主意,除非它们可以清楚地区分为错误消息(参见semipredicate problem);那些应该作为例外抛出,或者至少作为非值null / undefined返回;或者当你要求lookUp('Adolf', 'favouriteSoup')时,你可能会认为汤被称为"No such contact"。但是,如果你给出的任务是返回错误信息,我不认为你可以做任何事情。

答案 1 :(得分:0)

您可以使用forEach

loopUp方法更改为此方法
function lookUp(firstName, prop)
{
  var propValue = "No such contact";

  contacts.forEach( function( element ){ 
    if ( element.firstName == firstName ) 
    {
       propValue = element[ prop ] ? element[ prop ] : "No such property"; 
    }
  } );
  return propValue;
}

此外,就像@Amadan提到而不是返回错误消息一样,抛出一个Error,你需要在调用方法中捕获它。

try 
{
   lookUp();//making call here
}
catch(e)
{ 
   console.error( e );
}

答案 2 :(得分:0)

我建议将两个想要的函数分成两个函数。

  1. 获取具有给定键/值对lookUp(a, k, v)
  2. 的所有对象
  3. 只从对象getKey(a, k)
  4. 的数组中获取一个键

    &#13;
    &#13;
    function lookUp(a, k, v) {
        return a.filter(function (b) {
            return b[k] === v;
        });
    }
    
    function getKey(a, k) {
        return a.map(function (b ) {
            return k in b? b[k]: 'no property ' + k;
        });
    }
    
    function print(o) {
        document.write('<pre>' + JSON.stringify(o, 0, 4) + '</pre>');
    }
    
    var contacts = [{ "firstName": "Sherlock", "lastName": "Holmes", "number": "0487345643", "likes": ["Intruiging Cases", "Violin"] }, { "firstName": "Akira", "lastName": "Laine", "number": "0543236543", "likes": ["Pizza", "Coding", "Brownie Points"] }, { "firstName": "Harry", "lastName": "Potter", "number": "0994372684", "likes": ["Hogwarts", "Magic", "Hagrid"] }, { "firstName": "Kristian", "lastName": "Vos", "number": "unknown", "likes": ["Javascript", "Gaming", "Foxes"] }];
    
    print(lookUp(contacts, 'firstName', 'Sherlock'));
    print(getKey(lookUp(contacts, 'firstName', 'Sherlock'), 'likes'));
    &#13;
    &#13;
    &#13;