本文详解如何正确过滤数组中的偶数,保留奇数,并额外校验数字位数(如六位数),避免常见循环修改索引导致的遗漏问题,推荐使用 filter() 方法实现简洁可靠的逻辑。
本文详解如何正确过滤数组中的偶数,保留奇数,并额外校验数字位数(如六位数),避免常见循环修改索引导致的遗漏问题,推荐使用 `filter()` 方法实现简洁可靠的逻辑。
在 JavaScript 中,若想从数字数组中“移除偶数”,本质是筛选出所有奇数。初学者常误用 for 循环配合 splice() 或直接跳过偶数却未正确处理索引变化,导致漏判(如原问题中 123456 和 345678 未被排除),或逻辑条件错误(例如 currentBulb === 6 混淆了数值与位数判断)。
关键问题在于:
- currentBulb === 6 判断的是值是否等于数字 6,而非“是否为六位数”;
- currentBulb % 2 === 1 虽可识别奇数,但结合错误的前置条件后整个判断失效;
- 使用 push() 时未对“六位数”做字符串长度校验(123456 是六位数但为偶数,应被排除;234567 是六位奇数,应保留)。
✅ 正确做法是使用函数式方法 Array.prototype.filter() —— 它安全、不可变、语义清晰:
function findEfficientBulbs(serialNumbers) {
return serialNumbers.filter(num => num % 2 === 1 && String(num).length === 6);
}
// 示例调用
console.log(findEfficientBulbs([123456, 234567, 345678, 456789]));
// 输出: [234567, 456789]
? 代码说明:
- num % 2 === 1:准确判断奇数(注意:对负数需用 num % 2 !== 0 更健壮,但本题数据均为正整数);
- String(num).length === 6:将数字转为字符串后取长度,精准校验是否为六位数(比数学运算如 num >= 100000 && num
- filter() 返回新数组,不修改原数组,避免副作用,也彻底规避循环中索引错乱风险。
⚠️ 注意事项:
- 避免在 for 循环中边遍历边 splice() 删除元素——这会改变数组长度和后续索引,极易遗漏相邻元素;
- 若必须用循环,应倒序遍历(i--)或收集待删索引再批量处理;
- 对用户输入或不确定数据,建议增加类型校验:typeof num === 'number' && !isNaN(num);
- 六位数校验需确保数字无前导零(如 001234 作为数字会被转为 1234,长度为 4),因此该方案默认输入为标准整数。
总结:过滤偶数不是“删除动作”,而是“条件筛选”。拥抱 filter()、善用类型转换、厘清业务逻辑(奇数 + 六位),即可写出简洁、可靠、易维护的代码。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











