JavaScript如何检查对象数组指定键存在性并统计匹配数量
前置代码
const student= [ { student_id: 0, name: "Rhoda Salas", checked:"checked" }, { student_id: 1, name: "Jewell Avery" }, { student_id: 2, name: "Susanne Harris", checked:"checked" } ]
需求:从上述学生信息数组中,筛选出所有包含checked键的对象,同时统计符合条件的对象总数,以下是常见实现方式:
方式1:
filter()+hasOwnProperty()
最常用的简洁写法,hasOwnProperty只会判定对象自身存在的键,不会受原型链上的属性影响,结果最严谨。filter返回的新数组就是所有符合条件的对象,其length属性就是符合条件的总数。// 筛选符合条件的学生对象 const checkedStudents = student.filter(item => item.hasOwnProperty('checked')) // 统计总数 const total = checkedStudents.length console.log(checkedStudents) // 输出2条带checked键的学生数据 console.log(total) // 输出2方式2:
filter()+in运算符
写法更简洁,in运算符会判定键是否存在于对象自身或原型链上,当前场景下学生对象都是普通字面量对象,不存在原型链污染的话,结果和方式1一致。const checkedStudents = student.filter(item => 'checked' in item) const total = checkedStudents.length方式3:基础
for循环手动收集
不依赖数组高阶方法,兼容性最好,适合极低版本JS环境,逻辑直白可定制性强。const checkedStudents = [] let total = 0 for (let i = 0; i < student.length; i++) { const curItem = student[i] if (curItem.hasOwnProperty('checked')) { checkedStudents.push(curItem) total++ } }方式4:
for...of循环遍历
是基础for循环的简化写法,不需要手动维护数组索引,代码可读性更高。const checkedStudents = [] let total = 0 for (const item of student) { if ('checked' in item) { checkedStudents.push(item) total++ } }方式5:
reduce()单次遍历完成筛选+统计
只需要遍历一次数组就能同时拿到筛选结果和计数,不需要二次读取数组长度,数据量较大时性能更优。const { checkedStudents, total } = student.reduce((acc, cur) => { if (cur.hasOwnProperty('checked')) { acc.checkedStudents.push(cur) acc.total++ } return acc }, { checkedStudents: [], total: 0 })
避坑提示:不要直接用
if(item.checked)作为判断条件,这种写法只会在checked的值为真值(非空字符串、非0、非false、非null、非undefined)时判定为通过,如果键存在但值为假值,会出现漏判,不符合「判断键是否存在」的核心需求。
内容的提问来源于stack exchange,提问作者Liladhar Harode
相关产品推荐
相关产品推荐

