Profile lookup challenge advice

Tell us what’s happening:
Describe your issue in detail here.
Hi.
Struggled with this one. Can anyone help explain why my code doesn’t pass if I include my final return command within my for loop as the final else statement of my original if statement.

got there in the end by having it return outside the for loop but I don’t understand why it shouldn’t return if the first if statement is false. as an else statement…

Hope I’ve explained myself Ok. Thanks in advance for any help. Sorry if this is in the wrong place/ wrong format.

  **Your code so far**
// Setup
const 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 (let i = 0; i < contacts.length; i++) {
  if (contacts[i].firstName == name) {
    if (contacts[i].hasOwnProperty(prop)) {
      return contacts[i][prop];
    } else {
      return "No such property";
    }
  } else {
    return "No such contact";
  }
} 
// Only change code above this line
}

lookUpProfile("Akira", "likes");
  **Your browser information:**

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

Challenge: Profile Lookup

Link to the challenge:

function lookUpProfile(name, prop) {
// Only change code below this line
for (let i = 0; i < contacts.length; i++) {
  // pay attention to this log, the first output is false. 
  // So if you were to search for an existing name but it's not 
  // the "first" one in the list, it will always return 
  // "No such contact".
  console.log(contacts[i].firstName == name)
  if (contacts[i].firstName == name) {
    if (contacts[i].hasOwnProperty(prop)) {
      return contacts[i][prop];
    } else {
      return "No such property";
    }
  } 
} 
// Only change code above this line
}

And that’s why you place the return out of the for loop.

1 Like

I don’t understand why it shouldn’t return if the first if statement is false

So a return immediately ends the function and returns a value as the “evaluation” of a function. That is literally and exactly the intent of a return statement.

Given you are looping through an array, you have three possible outcomes for each thing in that array.

  1. The current array item isn’t a match.
  2. The current array item is a match, but lacks the property.
  3. The current array item is a match and had the property.

If either of the last two applies, then yes - we have found our only match and we can return some value.

But if the name of this one array element doesn’t match, is it valid to assume that the next one, or the fifteenth one, or the last one won’t? We still have to keep looping, checking each array member for a match, until one of two things happen:

  1. We find a match, or
  2. We check the entire list and there is no match.

If we have the return inside the loop when there is no match, we are returning too early. We haven’t checked them all.

2 Likes

Thanks so much. Was really struggling with this.
Had confused my first if statement for a “catch all” that would only return false if the name supplied didn’t exist. Forgetting the whole purpose of the loop………

Thanks for the explanations. Onto the next. See you again soon no doubt.

1 Like

This topic was automatically closed 182 days after the last reply. New replies are no longer allowed.