为何我的JavaScript for循环未遍历完数组,提前终止?
问题分析:数组相邻元素乘积遍历不全的原因
你的代码出现遍历终止过早的问题,核心原因有两个:
1. 循环条件随数组长度动态变化
循环中使用i < inputArray.length作为判断条件,但每次执行inputArray.shift()都会删除数组的第一个元素,导致数组长度不断缩短。以测试用例[3, 6, -2, -5, 7, 3]为例:
- 初始数组长度为6,i=0,满足条件执行第一次循环,数组变为
[6, -2, -5, 7, 3](长度5) - i=1,满足1 < 5,执行第二次循环,数组变为
[-2, -5, 7, 3](长度4) - i=2,满足2 < 4,执行第三次循环,数组变为
[-5, 7, 3](长度3) - i=3,此时3 < 3不成立,循环直接终止,所以只得到3个乘积结果
2. 固定取前两个元素计算乘积
你每次都计算inputArray[0] * inputArray[1],结合shift()操作,本质上是在依次计算原数组的(0,1)、(1,2)、(2,3)这三组乘积,但因为循环提前终止,漏掉了(3,4)、(4,5)这两组。
修正后的代码
不需要修改原数组,直接遍历到倒数第二个元素,计算每对相邻元素的乘积,最后取最大值即可:
function solution(inputArray) { const products = []; // 遍历到倒数第二个元素,避免i+1越界 for (let i = 0; i < inputArray.length - 1; i++) { products.push(inputArray[i] * inputArray[i + 1]); } // 返回最大乘积 return Math.max(...products); } console.log(solution([3, 6, -2, -5, 7, 3])); // 输出21
修正说明
- 循环条件改为
i < inputArray.length - 1,确保每个元素都能和下一个元素配对,不会因数组长度变化提前终止循环 - 直接通过
i和i+1索引获取相邻元素,无需修改原数组,逻辑更清晰 - 最后用
Math.max(...products)直接得到所有相邻乘积中的最大值,完全符合题目需求
内容的提问来源于stack exchange,提问作者Cody Polland
相关产品推荐
相关产品推荐

