What is wrong with my code? last else

Hi all. I’m hoping someone can help me understand what is wrong with this code as I’m just starting on JS and I’ve been stuck on trying to find out exactly what is happening. It seems to work fine when I remove the last else in the function but I don’t get why that is. I would have thought at least both options were valid.

I would really appreciate some input.

My code so far


//Setup
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(name, prop){
// Only change code below this line
  for(var i=0; i<contacts.length; i++){
    if(contacts[i].firstName == name){
      if(contacts[i][prop]){
        return contacts[i][prop];
      }
      else{
        return "No such property";
      }
    }
    else{
      return "No such contact";
    }
  }
// Only change code above this line
}

// Change these values to test your function
var profile = lookUpProfile("Harry", "lastName");
console.log(profile);


Browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36.

Link to the challenge:
https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/basic-javascript/profile-lookup/

You need to return the No such contact outside of the for loop.

function lookUpProfile(name, prop){
// Only change code below this line
  for(var i in contacts){
    if(contacts[i].firstName === name){
        if(contacts[i][prop]){
            return contacts[i][prop]
        } else {
            return "No such property";
        }
    }
  }
  return "No such contact";  //Return it here instead. 
}

Right. Thanks. I tried that and it worked, but I’m really struggling to understand why, and I’m feeling stupid. I would think that even inside the loop the return "No such contact" should work if the first conditional if(contacts[i].firstName === name) turned false.

What am I missing? What is my code doing in this case?

It has to be able to check all the objects. If you return in the else then it will return out of the function for the first object where the name property doesn’t match the name parameter.

The first object in the array is the “Akira” object. The name parameter is passed the “Harry” string. You loop the array and check the first objects name property, as they don’t match you execute the else statement and return “No such contact”, returning out of the loop and the function. So you never get to check the rest of the objects in the array.

2 Likes

OMG. Thanks. It was very simple but I just couldn’t get it

1 Like