所以,我理解这个例子中的一切,但有一点。 在搜索功能中我为什么需要编写
if (friends[key].firstName === name)
而不是
if (key.firstName === name)
我相信当对象被逐一抓取时,写“朋友[关键] .firstName”似乎是多余的。
循环是否只有一个对象,只是将它与name参数进行比较?
var friends = {};
friends.bill = {
firstName: "Bill",
lastName: "Gates",
number: "(206) 555-5555",
address: ['One Microsoft Way','Redmond','WA','98052']
};
friends.steve = {
firstName: "Steve",
lastName: "Ballmer",
number: "(206) 444-5555",
address: ['One Microsoft Way','Redmond','WA','98052']
};
var list = function(friends) {
for (var key in friends) {
console.log(key);
}
};
var search = function(name) {
for (var key in friends) {
if (friends[key].firstName === name) {
console.log(friends[key]);
return friends[key];
}
}
};
search("Steve");
答案 0 :(得分:1)
因为使用for ... in循环,第一个变量(在这种情况下为key
)表示属性的名称,而不是值本身。对于来自语言的人来说,这是一个非常常见的误解...每个循环(通常语法上非常相似,但服务于完全不同的目的,因为它们用于迭代集合,不像for ... in循环,这是用于迭代对象的属性),其中变量直接表示当前迭代中的拉取值。
答案 1 :(得分:1)
在JavaScript中,其他语言中没有foreach
for (... in ...)
构造用于迭代对象中的键,而不是数组中的值。
如果您在数组上使用for (... in ...)
,那么"键"将数组索引作为字符串(例如"0"
,"1"
等...),这就是为什么你可以在技术上将它用于数组,但它绝对不是推荐的方式。
迭代数组的最常用方法是使用array.forEach(function(value, i) { ... })
,它只是一个辅助方法(和ES5的一部分)。
答案 2 :(得分:0)
for (var key in friends) {
friends
是您的对象,您正在循环保存var key
中对象键的对象。所以密钥只保存您当前正在循环的密钥:steve
或bill
。要访问该对象,请使用object [key],因此friends[key]
是正确的用法
如果您不喜欢这样,可以尝试使用:
var keys=Object.keys(friends);
for(var i=0;i<keys.length;i++){
var friend=friends[keys[i]];
console.log(friend.firstName);
}