Samurai Jack
Samurai Jack

Reputation: 3135

Return object's property if it is found into an array of objects in JavaScript

I have the following array of objects:

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"]
    }
];

I want to define a function, lookUpProfile(firstName, prop), which for the input data:

lookUpProfile("Akira", "likes");

will return:

["Pizza", "Coding", "Brownie Points"]

This is my solution so far which doesn't return something till now:

function lookUpProfile(firstName, prop){
    for(var i = 0; i < contacts.length; i++){
        if(contacts[i].firstName == firstName){
            for(var j = 0; j < contacts[i].length; j++){
                if(contacts[i].hasOwnProperty(prop))
                    return prop;
            }
        }
    }
}

Has anyone any idea to solve this? Thanks

Upvotes: 6

Views: 152

Answers (4)

Suren Srapyan
Suren Srapyan

Reputation: 68685

You can try to do like this. Find the item with .find() function (ES6) and return the appropriate property using bracket [] syntax.

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 lookUpProfileES6(name, prop){
  var found = contacts.find(item => item.firstName === name);
  if(found){
      return found[prop];
  }
}

function lookUpProfileES5(name, prop){
  var found = null;
  for(var i = 0; i < contacts.length; i++){
      if(contacts[i].firstName === name){
         found = contacts[i];
         break;
      }
  }
  
  if(found){
      return found[prop];
  }
}

var resultES6 = lookUpProfileES6("Akira", "likes");
var resultES5 = lookUpProfileES5("Akira", "likes");

console.log(resultES6);
console.log(resultES5);

Upvotes: 3

brk
brk

Reputation: 50346

You can do like this

// Create a function which will filter out the requirement
var filtered = function(name, likes) {
  var _toRet = ''
  contacts.filter(function(elem, index) {
    // check if the first name is same as requires
    // check if the object have property likes
    // Since the requirement is to search the likes array
    if (elem.firstName === name && elem.hasOwnProperty(likes)) {
      _toRet = elem[likes]  
    }
    return _toRet  // return from filter callback

  })
return _toRet  // return from the function
}

console.log(filtered('Akira', 'likes'))

DEMO

Upvotes: 1

Travis J
Travis J

Reputation: 82337

The problem with your code was this line:

for(var j = 0; j < contacts[i].length; j++){

There is no need to attempt to iterate again here. Moreover, contacts[i] is an object and thus has no length property, so you are comparing 0 < undefined which is always false.

This results in your conditional check for property never occurring. In addition to this, prop is an accessor here. So while it may hold the property name it does not hold the property value. In order to properly return the property value, you need to use it as an accessor in the form of [prop] on the current object.

Remove the second iteration, properly access the contact object, and your function will work properly.

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];
  }
 }
}

Upvotes: 1

dfsq
dfsq

Reputation: 193301

You problem is that you are trying to loop over object with for loop with numeric indeces. You don't need second loop at all. It could be as simple as

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];
      }
    }
  }
}

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];
    }
  }
}

console.log(lookUpProfile("Akira", "likes"))

Upvotes: 1

Related Questions