Не удается прочитать свойство ‘online’ неопределенного типа

#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 }}
    ]);