Codecademy javascript任务

时间:2013-08-15 14:05:46

标签: javascript

我正在开发codeAcademy的javascript部分,而且我非常关注其中一个练习。 这是我的代码:

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

我对for / in循环感到很困惑。我一直在做这个练习一段时间,并想知道是否有人可以帮助我理解。主要是搜索功能。它假设能够查看给定名称是否在对象中并打印关联的联系信息。我完全迷失了。我甚至尝试重新启动整个部分并且仍然卡住了。

3 个答案:

答案 0 :(得分:1)

在Javascript中,for-in循环将遍历每个对象属性。

首先创建的朋友对象只有一个属性,也是一个描述比尔盖茨的对象。然后它被另一个只有一个属性的对象覆盖,但现在描述上帝史蒂夫·乔布斯。

最后,在搜索功能中,您将浏览朋友的每个属性并将其与字符串进行比较。在for-in循环内,name是一个变量,它包含当前循环迭代中使用的属性的名称。因此,如果您使用变量的名称(即:steve),您将获得匹配。如果您希望匹配存储在对象中的名称,则必须在name函数的声明中使用未调用search的参数,并进行如下检查:

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

另请注意,在使用Bill创建friends变量后,您可以使用Steve重新创建它。因此,您最终只能在该变量中使用一个“联系人”。您可以像这样更改对象声明:

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

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

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

然后你的朋友对象现在会有两个Sillicon山谷的海盗。

答案 1 :(得分:0)

首先你有错误的朋友var定义,你用Steve覆盖Bill。

它假设与此类似

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

现在回答你的问题了。

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

一些解释。 如果未定义“friends [name]”,则表示您没有指定名称的对象。 如果它返回一些Object,你只需得到“firstName”的值或对象中的任何其他属性。

答案 2 :(得分:0)

Javascript中的for in循环将循环遍历对象的每个属性。不幸的是,您的对象只有1个属性steve,因为您使用第二个var friends = ...语句覆盖整个对象。循环访问对象时,name变量将成为朋友对象中朋友的字符串索引。找到名称匹配后,您可以使用friends[name]来使用联系信息。如果您正在寻找与您的搜索名称相同的朋友,您可能需要查看具体的名字

正如旁注,因为Javascript是一种松散类型的语言,所以不需要遍历整个friends对象来查看你是否有一个具有该名称的朋友。这是一个代码示例:

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