
本文详解如何使用 filter() 方法精准剔除偶数、保留奇数,并结合字符串长度校验,解决初学者在循环中误删或漏判的常见问题。
本文详解如何使用 filter() 方法精准剔除偶数、保留奇数,并结合字符串长度校验,解决初学者在循环中误删或漏判的常见问题。
在 JavaScript 中,从数组中“移除偶数”本质上是筛选出所有奇数——更准确地说,是构建一个仅包含满足条件(奇数且为 6 位数)的新数组。初学者常误用 for 循环配合 splice() 或错误逻辑(如原代码中 currentBulb === 6)导致结果异常,根本原因在于:直接修改遍历中的数组会引发索引偏移,而条件判断逻辑与需求严重不符。
来看原代码的问题所在:
if (currentBulb === 6 && currentBulb % 2 === 1) { ... }
该条件实际要求元素严格等于数字 6 且为奇数(6 % 2 === 0,永远不成立),因此整个循环未推入任何元素,返回空数组 [] —— 这正是测试断言失败(期望 [234567, 456789])的根本原因。
✅ 正确解法是使用函数式方法 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:判断奇数(余数为 1)。也可写作 num % 2 !== 0,二者等价且更健壮(兼容负数);
- String(num).length === 6:将数字转为字符串后检查长度,这是判断“6 位数”的可靠方式(num >= 100000 && num
- filter() 自动遍历、返回新数组,不修改原数组,彻底规避索引错乱风险。
⚠️ 注意事项:
- 避免在 for 循环中一边遍历一边 splice() 删除元素——这会改变数组长度和后续元素索引,导致跳过相邻项;
- 数字的“位数”必须通过字符串转换或数学范围判断,不能用 num === 6 这类字面量比较;
- 若输入可能含非数字(如 null、字符串 "123"),建议增加类型校验:typeof num === 'number' && !isNaN(num)。
总结:用 filter() 替代手动循环筛选,既简洁又可靠;明确区分“数值奇偶性”与“数字位数”两个独立条件,并用合适的数据类型(字符串)处理位数判断——这是写出健壮数组过滤逻辑的关键。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











