编译此代码时,我收到一个错误,指出obj不可迭代。为什么?我必须检查有多少用户在线
let users = {
Alan: {
age: 27,
online: false
},
Jeff: {
age: 32,
online: true
},
Sarah: {
age: 48,
online: false
},
Ryan: {
age: 19,
online: true
}
};
function countOnline(obj) {
let num =0;
for(let user of obj){
if(user['online']==true){
num++;
}
}
return num;
}
console.log(countOnline(users));
因为您使用的是for...of
而不是for...in
。
for...of
用于循环访问可迭代对象,同时循环访问对象的可枚举属性for...in
。要使for...of
正常工作,对象必须实现@@iterator
方法(数组、字符串、Set 等(
let users = {
Alan: {
age: 27,
online: false
},
Jeff: {
age: 32,
online: true
},
Sarah: {
age: 48,
online: false
},
Ryan: {
age: 19,
online: true
}
};
function countOnline(obj) {
let num = 0;
for (let user in obj) {
if (obj[user]['online'] == true) {
num++;
}
}
return num;
}
console.log(countOnline(users));
在for...in
中,user
变量将表示对象的键,如Alan
。因此,要获取属性的值,您需要使用obj[user]
(例如:obj["Alan"]
(。因此,条件将更改为:
if (obj[user]['online'] == true)
默认情况下对象没有@@iterator
符号,要使用for..of
您需要将其添加到对象中:
let users = {
Alan: {
age: 27,
online: false
},
Jeff: {
age: 32,
online: true
},
Sarah: {
age: 48,
online: false
},
Ryan: {
age: 19,
online: true
}
};
users[Symbol.iterator] = function*() {
for (value of Object.values(this)) {
yield value;
}
};
for (let user of users) {
console.log(user)
}
或将for..of
与Object.entries
一起使用(或Object.values
(
let users = {
Alan: {
age: 27,
online: false
},
Jeff: {
age: 32,
online: true
},
Sarah: {
age: 48,
online: false
},
Ryan: {
age: 19,
online: true
}
};
for (let [key, value] of Object.entries(users)) {
console.log('key :', key, 'value : ', value)
}
console.log('***********');
for (let user of Object.values(users)) {
console.log({user})
}