为什么 obj 不是可迭代的



编译此代码时,我收到一个错误,指出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..ofObject.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})
}

最新更新