Basic Data Structures - Iterate Through the Keys of an Object with a for...in Statement

I have the solution here,
But I do not understand why I have to write [user] into the if statement. It’s my understanding that the square bracket notation is used to take you through the keys of an object, and here is being used to get to the ‘true /false value’ part of the object so it can be evaluated. I am confused because no part of the object is called ‘user’, so why am I having to write it in square brackets?

Your code so far

const users = {
  Alan: {
    online: false
  },
  Jeff: {
    online: true
  },
  Sarah: {
    online: false
  }
}

function countOnline(usersObj) {
  // Only change code below this line
  let result=0;
for (let user in usersObj) {
if (usersObj[user].online===true) {
result++;
     }
}
return result;
  // Only change code above this line
}

console.log(countOnline(users));

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.63

Challenge: Basic Data Structures - Iterate Through the Keys of an Object with a for…in Statement

Link to the challenge:

In this case, the square bracket notation allows you to access a property of an object. But it does not by itself iterate through the keys of an object. That’s why you need to use a for...in loop to go through each of the keys in the usersObj.

The user variable is coming from the for...in loop:

for (let user in usersObj) {

This loop is automatically going through each property name in usersObj and putting the property name in user so that you can then access it inside the loop, as you are doing here:

if (usersObj[user].online === true) {

Since user is a variable that holds the name of a property in usersObj then you have to use bracket notation to access that property in usersObj. So the first time through the loop, user will be set to “Alan” and thus the if statement can be translated to:

if (usersObj["Alan"].online === true) {

And then the second time through the loop it will be:

if (usersObj["Jeff"].online === true) {

And so on…

2 Likes

Thank you for the explanation