#javascript #json
#javascript #json
Вопрос:
Вот мой код, я пытаюсь подсчитать, сколько онлайн-пользователей у нас есть с помощью функции countOnline.
Я получаю сообщение об ошибке «Не удается прочитать свойство ‘online’ неопределенного типа»;
function countOnline(usersObj) {
let amount=0;
for(let user in usersObj){
if(usersObj.user.online){
amount ;
}
}
return amount;
}
let a = countOnline({
Alan: { online: false },
Jeff: { online: true },
Sarah: { online: false }
});
console.log(a);
Комментарии:
1. Попробуйте: ‘ usersObj[user].online’ Или ‘user.online’
2. В вопросе нет JSON .
Ответ №1:
Вы пытаетесь получить свойство user
, вместо которого оно должно быть именем пользователя. Используйте [user]
вместо .user.
при повторении ключей объекта.
Смотрите исправленный фрагмент ниже:
function countOnline(usersObj) {
let amount=0;
for(let user in usersObj){
if(usersObj[user].online){ // <-- see, I placed user in [ ]
amount ;
}
}
return amount;
}
let a = countOnline({
Alan: { online: false },
Jeff: { online: true },
Sarah: { online: false }
});
console.log(a);
Альтернативное решение
Вы можете выполнить итерацию значений объекта еще более чистым и читаемым способом, например, с использованием Object.values()
метода, который вернет вам массив всех пользователей в вашем случае, поэтому вам нужно просто уменьшить его.
function countOnline(usersObj) {
return Object.values(usersObj).reduce((total, user) => user.online ? total 1 : total, 0)
}
let a = countOnline({
Alan: { online: false },
Jeff: { online: true },
Sarah: { online: false }
});
console.log(a);
И даже короче, но менее производительный:
let usersObj = {
Alan: { online: false },
Jeff: { online: true },
Sarah: { online: false }
};
let onlineCount = Object.values(usersObj).filter(u => u.online).length;
console.log(onlineCount);
Ответ №2:
Вы пытаетесь получить доступ userObj.user.online
, в то время как оно должно быть userObj[user].online
:
function countOnline(users) {
let amount = 0;
for (const user in users) {
if (users[user].online) {
amount ;
}
}
return amount;
}
const a = countOnline({
Alan: {
online: false
},
Jeff: {
online: true
},
Sarah: {
online: false
}
});
console.log(a);
function countOnline(usersObj) {
let amount=0;
for(let user in usersObj){
if(usersObj.online){
amount ;
}
}
return amount;
}
let a = countOnline({ Alan: { online: false }, Jeff: { online: true }, Sarah: { online: false } });
console.log(a);
Комментарии:
1. Это тоже неверно. Вы повторяете
usersObj
, но внутри итерации вы также ссылаетесь наusersObj
Ответ №3:
Вы использовали для in. словарь не может быть итерирован, как массивы. вам нужен ключ, значение. Просто попробуйте это.
function countOnline(usersObj) {
let amount=0;
for (const [key, value] of Object.entries(usersObj)) {
if(value.online){
amount ;
}
}
return amount;
}
let a = countOnline({
Alan: { online: false },
Jeff: { online: true },
Sarah: { online: false }
});
console.log(a);
Если вы хотите использовать for in
цикл в своем коде, сделайте так
let a = countOnline([
{Alan: { online: false }},
{Jeff: { online: true }},
{Sarah: { online: false }}
]);