本文详解如何使用 filter() 方法高效移除数组中的偶数,并结合位数校验(如六位数)精准筛选奇数,同时指出初学者常见逻辑错误及修复方案。
本文详解如何使用 filter() 方法高效移除数组中的偶数,并结合位数校验(如六位数)精准筛选奇数,同时指出初学者常见逻辑错误及修复方案。
在 JavaScript 中,若需从数字数组中“移除偶数、保留奇数”,最直观且安全的方式是创建新数组筛选奇数,而非在遍历中修改原数组(如用 splice),否则易因索引偏移导致漏判——这正是提问者代码中仍残留 123456 和 345678 的根本原因。
先看原始代码的问题所在:
if (currentBulb === 6 && currentBulb % 2 === 1) { ... }
此处存在两个关键错误:
- currentBulb === 6 是误将“数字值等于 6”当作条件,而实际需求是“数字有 6 位”;
- currentBulb % 2 === 1 虽可判断奇数,但 === 6 的干扰使整个条件永远为 false(因为 234567 !== 6),最终返回空数组 [],与期望结果 [234567, 456789] 完全不符。
✅ 正确解法:使用 Array.prototype.filter()
filter() 创建一个新数组,仅包含使回调函数返回 true 的元素,语义清晰、无副作用、无需手动管理索引:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
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:将数字转为字符串后检查长度,避免数值位数计算的复杂性(如 Math.floor(Math.log10(num)) + 1 易出错且不处理 0 或负数);
- 条件使用 && 确保同时满足“奇数”和“六位数”,符合题干隐含需求(“efficient bulbs”需满足双重标准)。
⚠️ 注意事项:
- 避免在 for 循环中用 splice(i, 1) 删除元素——这会改变数组长度和后续元素索引,导致跳过相邻项;
- 不要混淆 === 6(值比较)与 .length === 6(位数比较);
- 若输入可能含非数字(如 null, undefined, 字符串数字),建议增加类型校验:typeof num === 'number' && !isNaN(num)。
总结:面向筛选场景,优先选用声明式方法(filter/map/reduce),逻辑简洁、可读性强、不易出错;而传统 for 循环更适合需复杂状态控制或性能极致优化的场景。掌握 filter 的谓词设计(即回调函数的布尔逻辑),是处理数组过滤任务的核心能力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










