简体   繁体   中英

Retrieving property from Javascript Object

For the below code. The following return the correct results:

lookUpProfile("Bob", "number"); // returns 'No such contact'
lookUpProfile("Akira", "address"); // return 'No such property'

However, for the following it doesn't return the expected result.

lookupProfile("Kristian", "lastName"); // should return 'Vos'
lookupProfile("Sherlock", "likes"); // should return ["Intriguing Cases", "Violin"]

Thank you.

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){
// Only change code below this line

  for (var i = 0; i < contacts.length; i++) {
    if (contacts[i][firstName] === firstName) {
      if (contacts[i][prop] === prop) {
        return contacts[i][prop];
      } else {
        return "No such property";
      }
    } else {
      return "No such contact";
    } 
  }
// Only change code above this line
}

You are trying to access the property like this contacts[i].prop

prop is a variable thus you need to use the brackets notation contacts[i][prop]

Another way of doing this :

You can use Array#find() to get the contact with the first name.

find() will return undefined if it doesn't find a contact. They you can access the property and see if it returns undefined or not

 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) { const contact = contacts.find(c=>c.firstName === firstName); if(!contact) return "No such contact"; const propValue = contact[prop]; if(!propValue) return "No such property"; return propValue; } console.log(lookUpProfile("Bob", "number")); // returns 'No such contact' console.log(lookUpProfile("Akira", "address")); // return 'No such property' console.log(lookUpProfile("Kristian", "lastName")); // should return 'Vos' console.log(lookUpProfile("Sherlock", "likes")); // should return ["Intriguing Cases", "Violin"] 

And with a one-liner return

 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) { const contact = contacts.find(c=>c.firstName === firstName); return contact ? contact[prop] ? contact[prop] : "No such property" : "No such contact"; } console.log(lookUpProfile("Bob", "number")); // returns 'No such contact' console.log(lookUpProfile("Akira", "address")); // return 'No such property' console.log(lookUpProfile("Kristian", "lastName")); // should return 'Vos' console.log(lookUpProfile("Sherlock", "likes")); // should return ["Intriguing Cases", "Violin"] 

And using a for-loop

 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(let 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"; } } } return "No such contact"; } console.log(lookUpProfile("Bob", "number")); // returns 'No such contact' console.log(lookUpProfile("Akira", "address")); // return 'No such property' console.log(lookUpProfile("Kristian", "lastName")); // should return 'Vos' console.log(lookUpProfile("Sherlock", "likes")); // should return ["Intriguing Cases", "Violin"] 

Correct code for getting your prop:

return contacts[i][prop]

When you do contacts[i].prop it's looking for {'prop': ...}

Corresponding docs: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors

for (var key in contacts) {
  //You can loop through the contacts object
  var obj = contacts[key];//get the object
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM