JS实现数组连续数字求和:以NaN为分隔符并跳过NaN
解决方案:以NaN为分隔符对连续数字段求和
核心注意点:判断NaN必须用Number.isNaN(),因为NaN === NaN的结果永远是false,这是很多人踩坑的地方。
方法一:使用reduce实现
const arr = [NaN, NaN, 1, 2, 3, NaN, NaN, 4, 5, 6, 7, NaN, 8, 9, 10, NaN, 100, 200, 300, 400, 500]; const res = arr.reduce((acc, curr) => { if (!Number.isNaN(curr)) { // 累加当前数字到结果数组的最后一项,无则新增 acc.length ? (acc[acc.length - 1] += curr) : acc.push(curr); } else { // 遇到NaN时,仅当最后一项是有效数字才添加占位符,避免连续NaN干扰 if (acc.length && !Number.isNaN(acc[acc.length - 1])) { acc.push(null); } } return acc; }, []).filter(item => !Number.isNaN(item)); // 过滤占位符 console.log(res); // 输出:[6, 22, 27, 1500]
方法二:使用普通for循环实现
const arr = [NaN, NaN, 1, 2, 3, NaN, NaN, 4, 5, 6, 7, NaN, 8, 9, 10, NaN, 100, 200, 300, 400, 500]; const res = []; let currentSum = null; for (const num of arr) { if (!Number.isNaN(num)) { // 初始化或累加当前连续数字的和 currentSum = currentSum !== null ? currentSum + num : num; } else { // 遇到NaN且有正在累加的和时,存入结果并重置 if (currentSum !== null) { res.push(currentSum); currentSum = null; } } } // 处理数组末尾的连续数字段(若结尾不是NaN) if (currentSum !== null) { res.push(currentSum); } console.log(res); // 输出:[6, 22, 27, 1500]
常见错误原因:
- 用
curr === NaN判断NaN,导致无法正确识别分隔符; - 未处理连续NaN的情况,导致结果数组出现空值或错误累加;
- for循环结束后未处理最后一段非NaN数字,遗漏最后一组求和结果。
内容的提问来源于stack exchange,提问作者RGH
相关产品推荐
相关产品推荐

