JavaScript实现:判断从指定月份起所有status是否为Full
需求与优化方案
需求明确
我们需要判断一个包含month和status属性的对象数组是否满足以下任一条件:
- 所有月份的
status均为'Full' - 从某个非起始月份开始,到最后一个月份的所有
status均为'Full'
满足任一条件时返回true,否则返回false。
现有代码问题
你提供的identifyStatus函数存在以下问题:
- 循环变量
i未使用let/const声明,会成为全局变量,引发潜在的作用域问题 - 逻辑漏洞:当数组最后一个元素的
status不是'Full'时,仍可能错误返回true - 代码冗余,逻辑不够直观
最优实现方案
下面是更高效、逻辑清晰的实现,时间复杂度为O(n),且在多数场景下无需遍历整个数组:
function identifyStatus(data) { // 空数组直接返回false(可根据实际需求调整) if (data.length === 0) return false; // 最后一个元素不是Full,直接返回false(不可能存在符合要求的后缀) const lastItem = data[data.length - 1]; if (lastItem.status !== 'Full') return false; // 所有元素都是Full,直接返回true if (data.every(item => item.status === 'Full')) return true; // 从倒数第二个元素往前遍历,找到第一个非Full的元素 // 一旦找到,说明该元素之后的所有元素都是Full,符合需求 for (let i = data.length - 2; i >= 0; i--) { if (data[i].status !== 'Full') { return true; } } // 走到此处说明所有元素都是Full(前面已经判断过,实际不会执行到) return true; }
逻辑说明
- 空数组判断:避免数组为空时出现异常,可根据业务需求调整返回值
- 末尾元素校验:如果最后一个月份的
status不是'Full',直接返回false——因为无论从哪个月份开始,最后一个月份都属于目标范围,必须为'Full' - 全量校验:用
every快速判断所有元素是否都是'Full',是则返回true - 反向遍历找非Full元素:从倒数第二个元素往前找第一个非
'Full'的元素,找到则说明该元素之后的所有元素都是'Full',符合“从某一较晚月份开始全为Full”的需求,直接返回true
测试示例
- 全
Full数组:返回true Jan-Mar非Full,Apr-Dec全Full:返回trueNov非Full,Dec为Full:返回true(仅Dec为Full,属于“从较晚月份开始全Full”)Dec非Full:返回falseJan-Nov全Full,Dec非Full:返回false
内容的提问来源于stack exchange,提问作者user3233787
相关产品推荐
相关产品推荐

