Profile Lookup (I cant find out whats wrong with my code?)

Tell us what’s happening:

So this is the first condition : [ The function should check if name is an actual contact’s firstName and the given property ( prop ) is a property of that contact. If both are true, then return the “value” of that property.]

My code
for (var i=0; i < contacts.length; i+=1) {
if (contacts[i].firstName === name && contacts[i].hasOwnProperty(prop) === true) {
return contacts[i].prop;

i don’t see anything wrong here?
there are 2 condition, both have to be true, so i put it together.

but when i try to
console.log(lookUpProfile(“Akira”, “likes”));
it is showing undefined?

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+=1) {
    if (contacts[i].firstName === name && contacts[i].hasOwnProperty(prop) === true) {
        return contacts[i].prop;
    } else if (contacts[i].hasOwnProperty(prop) === false) {
        return "No such property";
    } return "No such contact";
}
// Only change code above this line
}

console.log(lookUpProfile("Akira", "likes"));
console.log(contacts[0].number)
**Your browser information:**

User Agent is: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36.

Challenge: Profile Lookup

Link to the challenge:

Hi @xavier.yeung
you need to check the logic of name and prop separatelly instead of doing AND && operation

Why dont you start by doing and checking an if statement checking the name first and then if statement checking the prop and then return this

This line of code wont work. because your not accessing

return contacts[i].prop;

so will do with a bracket, because you are entering a parameter value.

return contacts[i][prop];

Then if there is nothing to find with the prop then you can do a return of

return "No such property";

Remeber that if the contact its not to be found first then you will have to return at the end of your foor loop.

return "No such contact";
1 Like

you can start your for loop and then the first condition and second

function lookUpProfile(name, prop) {
  for (let i = 0; i < contacts.length; i++) {
    if (first condition) {
      if (second condition) {
        
      } 
    }
  }
  
}
1 Like

Always remember to use brackets () instead of using dot(.) , when dealing with nested arrays.

contacts[i][prop];

1 Like

thank you both! so i have changed to the below,
but the thing is that the “No such contact” at the end always overrides the first condition? it doesn’t run the second if condition?

function lookUpProfile(name, prop){

for (var i=0; i < contacts.length; i+=1) {
    if (contacts[i]["firstName"] === name) {
        if (contacts[i].hasOwnProperty(prop)){
            return contacts[i][prop];
        } return "No such property";
    } return "No such contact";
}

}

Your almost there… remember like @Kevinbrian105 explained. When you access an array of objects you do it with a Dot notation. So in this line will be fixed instead of this

if (contacts[i]["firstName"] === name) {

the right way will be

if (contacts[i].firstName === name) {

makes sure the return contact not found will be done at the end of the for loop to check if any contact.

2 Likes

and try to always use else statement after if .

2 Likes

thank you both!

i can finally pass the test with the following

for (var i=0; i < contacts.length; i+=1) {
    if (contacts[i].firstName === name) {
        if (contacts[i].hasOwnProperty(prop)) {
            return contacts[i][prop];
        } return "No such property";
        } 
        }return "No such contact";
        }

Awesome make sure you indent your code for better understanding.

this is the content of your loop - if the if statement doesn’t execute, you return No such contact and the loop never advance to next step.

I hope you noticed that and not just accidentally added brackets in the right place


this is correct, you can write it like this or like contacts[i].firstName, they mean the same thing