Profile Lookup If/Else logic order - WHat's the difference

Profile Lookup If/Else logic order - WHat's the difference
0

#1

I have spent hours trying to understand this - I know it has something to do with if…else statement logic order, but each time I have tried to follow I got lost. Someone please explain this to me and if possible give a pointer of how to handle if…else logic order(a hack/ quick method to remember e.g: “always start with the larger sample space …”)

Here it is:

The Task is as follows:
We have an array of objects representing different people in our contacts lists.

A lookUpProfile function that takes firstName and a property (prop) as arguments has been pre-written for you.

The function should check if firstName 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.

If firstName does not correspond to any contacts then return “No such contact”

If prop does not correspond to any valid properties then return “No such property”

CODE
This code is wrong

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++){
    
    if (contacts[i].hasOwnProperty(prop))
      {
        if(contacts[i].firstName === firstName){
          return contacts[i][prop];
        }
        else {
          return "No such contact";
        }

      }
// Only change code above this line
}
  return "No such property";
}
// Change these values to test your function
lookUpProfile("Harry", "likes");

THIS code is correct:

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++){
    
    if (contacts[i].firstName === firstName)
      {
        if(contacts[i].hasOwnProperty(prop)){
          return contacts[i][prop];
        }
        else {
          return "No such property";
        }

      }
// Only change code above this line
}
  return "No such contact";
}
// Change these values to test your function
lookUpProfile("Harry", "likes");

I will really appreciate if someone can help me explain the difference. Thank you in advance!


#2

See my comments in your solution below on why this does not work. I will assume the function has been called with:

lookUpProfile(“Harry”, “likes”);

function lookUpProfile(firstName, prop){
  
  for(var i=0;i < contacts.length;i++){
    
    if (contacts[i].hasOwnProperty(prop)) 
/* 
The first thing you need to ask i if the current contact has the same first name.
Instead, you are asking if the current contact has a property of the same name
contained in the variable prop.   In our example prop is "likes".  During the 1st 
iteration of the for loop, contact[0] is the following object:
{
 "firstName": "Akira",
 "lastName": "Laine",
 "number": "0543236543",
 "likes": ["Pizza", "Coding", "Brownie Points"]
}
Since this object has a "likes" property, your if statement above evaluates to true
 */
      {
/*Since the if statement evaluated to true above, you ask if the current object's firstName property is equal to the value contained in the firstName function argument.  
In this case, the object's firstName property value is "Akira" and firstName is "Harry",
so the if statement below evaluates to false and you return "No such contact" below
 */      
        if(contacts[i].firstName === firstName){
          return contacts[i][prop]; 
        }
        else {
          return "No such contact"; // this is return because "Akira" is not equal to "Harry"
        }

      }
// Only change code above this line
}
  return "No such property";
}


``