ajk4550
ajk4550

Reputation: 741

CodeAcademy javascript questing

I am working on codeAcademy's javascript section and I am so stuck on one of the exercises. Here is my code:

var friends = {
    bill:{
        firstName:"Bill",
        lastName: "Gates",
        number:"(206)555-5555",
        address:['One Microsoft Way', 'Redmond','wa','12345']
    }
};
var friends = {
    steve:{
        firstName:"Steve",
        lastName: "Jobs",
        number:"(555)555-5555",
        address:['One Apple Way', 'San Diego','ca','12345']
    }
};

var list = function()
{
    for (var something in friends)
    console.log(something);
}

var search = function(name)
{
    for (var contact in friends)
    {
        if (contact == name)
        {
            for (var contact_info in friends.name)
            {
            console.log(contact_info);
            }
        }
    }
}

I am pretty confused about the for/in loop. I have been working on this exercise for a while and was wondering if someone could help me understand. Mainly the search function. Its suppose to be able to see if the given name is in the the object and print the contact info associated. I am completely lost. I even tried restarting the whole section and still got stuck.

Upvotes: 1

Views: 2906

Answers (3)

Kyle
Kyle

Reputation: 4449

A for in loop in Javascript will loop through each property of an object. Unfortunately, your object will only have 1 property steve because you overwrite the entire object with your second var friends = ... statement. When looping through an object, your name variable will be the string index of your friend in the friends object. Once you find a match for the name, you can use the contact information by using friends[name]. If you are looking for a friend with the same first name as your search, you may want to look at the specific first name

Just as a side note, because Javascript is a loosely typed language, there is no need to loop through the entire friends object to see if you have a friend with that name. Here is a code sample:

var friends = {
    bill: {
        firstName: 'Bill', 
        lastName: 'Gates'
    }, 
    steve: {
        firstName: 'Steve', 
        lastName: 'Jobs'
    }, 
    steve2: {
        firstName: 'Steve', 
        lastName: 'Doe'
    }
}, 
search1 = function(name) {
    if(friends[name] !== undefined) { //Is there a friend with this index
        //Yay, we have a friend with this index!
    }
    else {
        //Sorry, we don't have a friend with this index
    }
}, 
search2 = function(name) {
    name = name.toLowerCase(); //Case insensitive
    for(var friend in friends) {
        if(friends[friend].firstName.toLowerCase() == name) { //Does this person have the same first name
            //This friend has the same first name
        }
    }
};

search1('steve'); //Will only give us Steve Jobs
search2('steve'); //Will give us Steve Jobs and Steve Doe

Upvotes: 0

Geeky Guy
Geeky Guy

Reputation: 9399

In Javascript, the for-in loop will go through each of an object properties.

Your friends object is first created having only one property, which is also an object, describing Bill Gates. Then it it overwritten by another object that also has only one property, but now describing God Steve Jobs.

Finally, in the search function, you are going through each property of friends and comparing them to a string. Inside a for-in loop, name is a variable that contains the name of the property used in the current iteration of the loop. So you'll get a match if you use the names of the variables (i.e.: steve). If you wish to match the names stored in the object, you have to use a parameter that is not called name in the declaration of the search function, and make the check like this:

if (contact.firstName == _name || contact.lastName == _name ||
    (contact.firstName + " " + contact.lastName) == _name)

Also notice that after you create your friends variable with Bill, you then recreate it with Steve. So you end up with only one "contact" in that variable. You could change your object declarations like this:

var friends = {}; // This creates an empty object

friends.bill = {
    firstName: "Bill",
    lastName: "Gates" // And so on...
};

friends.steve = {
    firstName: "Steve" // You get the drill
};

And then your friends object would have both pirates of the Sillicon Valley now.

Upvotes: 1

Alexander Gorelik
Alexander Gorelik

Reputation: 4385

First of all you have wrong friends var definition, you override Bill with Steve.

It suppose to be similar to this

var friends = {
    bill:{
        firstName:"Bill",
        lastName: "Gates",
        number:"(206)555-5555",
        address:['One Microsoft Way', 'Redmond','wa','12345']
    },
    steve:{
        firstName:"Steve",
        lastName: "Jobs",
        number:"(555)555-5555",
        address:['One Apple Way', 'San Diego','ca','12345']
    }
};

Now the answer to your question.

function search(name)
{
    // Length of friends  object received using Object.keys
    for (var p = 0; p < Object.keys(friends).length ;p++)
    {
        if(friends[name] != undefined){
            // Add to console and stop function execution if match found.
            console.log(friends[name].firstName); 
            return;
        }
    }
}

Some explanation. If "friends[name]" is undefined it means that you don't have object with specified name. If it returns some Object you just get the value of the "firstName" or any other property in the object.

Upvotes: 0

Related Questions