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