如何高效实现JavaScript数组状态计数判断并返回布尔值?
高效判断对象数组状态的单函数实现方案
需求说明
当数组满足以下任一条件时,需返回false:
- 数组中没有
return状态的元素 - 数组中没有
ordered状态的元素 - 数组中存在恰好1个
verification状态的元素 - 数组中存在恰好1个
active状态的元素
示例数组
const slots = [ { status: 'void' }, { status: 'closed' }, { status: 'ordered' }, { status: 'verification' }, { status: 'active' } ]
低效写法(需避免)
你提到的多次filter写法会重复遍历数组,效率较低:
// 示例低效代码 x = slots.filter((val) => val.status === 'verification' || val.status === 'active') if (x.length > 1) return false y = slots.filter((val) => val.status === 'return' && val.status === 'ordered') if (y.length > 0) return false
高效单遍历实现方案
我们可以通过单次遍历数组,同步统计关键状态的数量,最后统一判断条件,这样只需要遍历数组一次,性能更优:
function checkSlotsStatus(slots) { let hasReturn = false; let hasOrdered = false; let verificationCount = 0; let activeCount = 0; for (const slot of slots) { const status = slot.status; switch (status) { case 'return': hasReturn = true; break; case 'ordered': hasOrdered = true; break; case 'verification': verificationCount++; // 提前终止:数量超过1后,后续遍历不影响结果,可直接跳出 if (verificationCount > 1) break; break; case 'active': activeCount++; if (activeCount > 1) break; break; // 其他状态无需处理 default: break; } } // 触发返回false的条件判断 if (!hasReturn || !hasOrdered || verificationCount === 1 || activeCount === 1) { return false; } // 所有条件都不满足时返回true return true; }
代码说明
- 单次遍历:仅循环数组一次,在遍历过程中完成所有关键状态的统计,避免多次遍历带来的性能损耗
- 提前终止:当
verification或active的数量超过1时,后续遍历不会改变最终判断结果,可以提前跳出循环,进一步优化性能 - 逻辑清晰:遍历结束后集中判断所有触发
false的条件,代码可读性更强
内容的提问来源于stack exchange,提问作者Rafael Polonio
相关产品推荐
相关产品推荐

