无法读取未定义的属性“在线”

时间:2020-09-14 12:14:33

标签: 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);

3 个答案:

答案 0 :(得分: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 :(得分:2)

您正在尝试获取属性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() method,这将返回您所用的所有用户数组,因此您只需要减少它。

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 :(得分:0)

您用于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 }}
    ]);