如何检查对象属性值?如何统计对象中属性特定值的出现次数?
嘿,让我来帮你搞定这两个问题!
问题1:如何检查对象的属性值?
检查对象属性值有几种常用的方式,根据场景选就行:
- 点表示法:如果属性名是常规的(没有空格、特殊字符,不是JS关键字),直接用
.访问,就像你例子里的users.Ryan.online,直观又简单。 - 方括号表示法:当属性名是变量、带特殊字符(比如
user-name),或者需要动态获取时,就得用方括号,比如obj[变量名],这在循环遍历对象键名时特别有用。 - 先确认属性存在:如果不确定对象有没有某个属性,可以先用
'属性名' in obj或者obj.hasOwnProperty('属性名')检查,避免访问不存在的属性报错。
问题2:修复统计online为true的代码问题
你当前的代码输出0,问题出在对象的访问方式上!咱们一步步看:
你写了 if (obj.user == true),这里的 obj.user 是在找 obj 里名为 user 的属性,但你的对象里根本没有这个属性——循环变量 user 存的是每个用户的键名(Alan、Jeff、Ryan),所以得用方括号 obj[user] 才能拿到当前遍历的用户对象,之后再访问它的 online 属性。
给你修正后的代码:
function countOnline(obj) { let count = 0; for (let user in obj) { // 用方括号获取当前用户对象,再判断online属性 if (obj[user].online === true) { count++; } } return count; } let users = { Alan: { age: 27, online: false }, Jeff: { age: 32, online: true }, Ryan: { age: 19, online: true } }; console.log(countOnline(users)); // 现在会输出2,符合你的期望
另外,也可以用更简洁的现代JS写法,比如用 Object.values() 配合 reduce 统计:
function countOnline(obj) { // 先把对象的所有值转成数组,再累加online为true的数量 return Object.values(obj).reduce((total, user) => { return user.online ? total + 1 : total; }, 0); }
这个写法更紧凑,不需要手动写循环,可读性也不错。
内容的提问来源于stack exchange,提问作者A-Makeyev
相关产品推荐
相关产品推荐

