JS: Profile Lookup (Help)

Tell us what’s happening:

The code I have passes the assignment but I feel like my last else if statement is cheating as I know what the script is going to check.

The original code I tried was :

else if (contacts[i][“firstName”] !== name) {
return “No such contact”;
}

Which checked correctly with the Bob check but failed two of the other I believe.

What am I doing wrong?

  **Your 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 && contacts[i][prop]) {
    return contacts[i][prop];
  }
  else if (contacts[i]["firstName"] == name && !contacts[i][prop]) {
    return "No such property";
  }
  else if (name == "Bob") {
    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/88.0.4324.150 Safari/537.36.

Challenge: Profile Lookup

Link to the challenge:

Yep, it’s cheating :smiley:

Think through what your function is doing. It loops through ALL contacts, and eventually will find a match for firstName (or not).

So if you try lookUpProfile("Akira", "likes");, it will loop through 4 contact items, and for three of them, the name will not match. In that case, the code you tried would return No such contact and end the function, before it has even tried all contacts.

What you instead want to do is to return "No such contact" after the loop went through all contacts, and found no match anywhere.

2 Likes

Thanks I wasn’t thinking the exact steps the loop was taking.

I kept the !== name check outside the original for loop but added another for loop which seems… verbose. Is there a better way to do this?

function lookUpProfile(name, prop){
// Only change code below this line
  for (var i = 0; i< contacts.length; i++) {
    if (contacts[i]["firstName"] == name && contacts[i][prop]) {
      return contacts[i][prop];
    }
    else if (contacts[i]["firstName"] == name && !contacts[i][prop]) {
      return "No such property";
    }
  }
    for (var i = 0; i< contacts.length; i++) {
      if (contacts[i]["firstName"] !== name) {
        return "No such contact";
      }
    }
// Only change code above this line
}
lookUpProfile("Akira", "likes");

consider this:
in the first loop you are checking for each element if the name matches
when (if) that loops finishes, you know already what this would say:

1 Like

Yes, you don’t need a second loop, because there’s only two outcomes for the first loop:

  1. it finds a name, and either returns the desired data, or “no such property”. The important part is that no code outside the loop will ever run in this case, because a return statement terminates a function
  2. it finds no name. In this case, the loop finishes without returning anything, and the function keeps running. You’ve added a second loop, but you can have it much simpler
1 Like

I’ve edited your post for readability. When you enter a code block into a forum post, please precede it with a separate line of three backticks and follow it with a separate line of three backticks to make it easier to read.

You can also use the “preformatted text” tool in the editor (</>) to add backticks around text.

See this post to find the backtick on your keyboard.
Note: Backticks (`) are not single quotes (’).

1 Like