如何检查对象所有属性是否均为undefined?现有代码存在逻辑问题
检查对象所有属性是否均为undefined的正确方法
嘿,我明白你遇到的问题了——原来的代码逻辑确实有问题,咱们先拆解下哪里错了,再给你几个简洁靠谱的方案。
原代码的问题分析
你原来的代码里有两个关键错误:
for...in循环里的property是属性名(比如ishnationality),是个字符串,Object.keys(property)会返回这个字符串的字符数组(比如["i","s","h"...]),用它找undefined肯定找不到,返回-1,而JS里if(-1)会被视为true,所以只要循环到第一个属性就直接返回了,完全没达到“检查所有属性”的目的。- 你的逻辑方向也反了:原代码是“只要有一个属性是undefined就返回”,但你实际想要的是“所有属性都为undefined才返回”。
简洁的正确实现
方案1:ES6+ 推荐写法(最简洁)
用Object.values()获取对象所有属性值,再配合Array.every()判断所有值是否都是undefined:
// 检查filters所有属性是否全为undefined const allPropertiesUndefined = Object.values(filters).every(val => val === undefined); if (allPropertiesUndefined) { return this.restaurantsList; }
这个方法可读性拉满,every()会遍历数组,只有当所有元素都满足val === undefined时才返回true,完美符合你的需求。
方案2:兼容旧环境写法
如果你的项目需要兼容不支持Object.values()的旧环境,可以用Object.keys()遍历属性名再判断:
const allPropertiesUndefined = Object.keys(filters).every(key => filters[key] === undefined); if (allPropertiesUndefined) { return this.restaurantsList; }
Object.keys()会返回对象自身的所有可枚举属性名,和for...in(不加hasOwnProperty)的行为一致,适合旧环境使用。
补充:考虑继承属性的情况
如果你需要检查包括继承来的属性(一般很少用到),可以用for...in配合hasOwnProperty来实现:
let allPropertiesUndefined = true; for (const key in filters) { // 只检查自身属性,去掉hasOwnProperty则包含继承属性 if (filters.hasOwnProperty(key) && filters[key] !== undefined) { allPropertiesUndefined = false; break; // 只要找到一个非undefined的就可以终止循环了 } } if (allPropertiesUndefined) { return this.restaurantsList; }
内容的提问来源于stack exchange,提问作者Sireini
相关产品推荐
相关产品推荐

