如何判断数组内对象是否非空及统计非空对象数量?
嘿,这个问题挺常见的,我来给你一步步拆解清楚~
如何判断数组中的对象是否非空?
首先,判断单个对象是否为非空对象(即包含至少一个可枚举属性),最直接的方式是利用Object.keys()方法:
Object.keys(obj)会返回一个包含对象自身所有可枚举属性名的数组- 如果这个数组的长度大于0,就说明对象有至少一个属性,也就是非空的
举个简单的验证例子:
const emptyObj = {}; const nonEmptyObj = { name: "Derby County" }; console.log(Object.keys(emptyObj).length > 0); // false(空对象) console.log(Object.keys(nonEmptyObj).length > 0); // true(非空对象)
你也可以用Object.entries()或Object.values()替代Object.keys(),效果完全一致,比如Object.entries(obj).length > 0,核心原理都是通过属性相关数组的长度判断对象是否有内容。
统计数组中包含至少一个属性的对象数量
针对你给出的需求,我们可以用数组的filter()或reduce()方法轻松实现,两种方式各有侧重:
方法1:filter() + 长度判断(直观易懂)
先过滤出所有非空对象,再取过滤后数组的长度,就是我们要统计的数量:
const arr1 = [{}, {name: "Derby County", odds: 2}, {}, {}]; const count1 = arr1.filter(obj => Object.keys(obj).length > 0).length; console.log(count1); // 输出 1 const arr2 = [{}, {name: "Derby County", odds: 2}, {name: "Fullham", odds: 3} ,{}]; const count2 = arr2.filter(obj => Object.keys(obj).length > 0).length; console.log(count2); // 输出 2
方法2:reduce()累加计数(更高效,无额外数组创建)
如果想避免创建过滤后的新数组,可以用reduce()直接累加符合条件的对象数量:
const count = arr.reduce((total, currentObj) => { // 每遇到一个非空对象,总数加1,否则保持原数值 return total + (Object.keys(currentObj).length > 0 ? 1 : 0); }, 0); // 初始总数设为0
小提醒
上面的方法默认只针对可枚举属性,如果你的对象存在不可枚举属性需要统计,就用Object.getOwnPropertyNames()替代Object.keys()即可——不过日常开发中绝大多数场景都是处理可枚举属性,所以前面的方法完全够用啦。
内容的提问来源于stack exchange,提问作者a7dc
相关产品推荐
相关产品推荐

