在javascript中嵌套循环

Nesting loops in javascript

本文关键字:嵌套循环 javascript      更新时间:2024-06-05

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

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

如果两者都为真,则返回该属性的"值"。

对参数为"Kristian"answers"lastName"的函数lookUpProfile的调用应该返回值"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");

代码的问题是,第二个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示例

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

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

试试我的JSFiddle。