在javascript中嵌套循环

时间:2016-04-13 19:10:26

标签: javascript

我认为以下代码是正确的:

该函数应检查firstName是否为实际联系人的firstName,并且给定属性(prop)是该联系人的属性。

如果两者都为真,则返回"值"该财产。

使用参数" Kristian"调用函数lookUpProfile。和" lastName"应该返回价值" Vos"但事实并非如此。

有些想法哪里出错了?



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++){
        for(var j=0;j<contacts[i].length;j++){
            if(contacts[i][0]===firstName && contacts[i][j].hasOwnProperty(prop)){
                  return contacts[i][j];
                  }
            }
        }
    }



// Change these values to test your function
lookUpProfile("Kristian", "lastName");
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:0)

你的代码的问题是第二个for循环正在检查一个根本不存在的属性contacts[i].length。对象没有.length属性,只有Arrays。

你不需要第二个for循环来循环所有属性,你可以只检查firstName,然后检查你想要的属性是否存在,然后返回它。

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

应该是你想要的。

如果要循环所有对象属性,则应使用for in循环,如下所示:

for(var key in contacts[i]){ //place your check here using contacts[i][key] the get the value for the key }

修改:添加了for in示例

答案 1 :(得分:0)

您只能在查找函数中使用两行代码解决问题:

function lookUpProfile(firstName, prop) {
  var contact = contacts.find((c) => c.firstName === firstName);
  return contact.hasOwnProperty(prop) ? contact[prop] : null;
}

使用我的JSFiddle尝试一下。