JavaScript数组遍历到末尾后如何从头衔接继续循环计数
问题排查
原代码返回0的核心原因是循环终止条件逻辑错误:
"Sat"在数组中的索引是5,"Tue"的索引是1,循环初始值i=5,第一次判断条件i < end也就是5 < 1直接不成立,循环从头到尾没执行,计数自然一直是0。- 普通的数值大小判断,根本适配不了数组环形遍历(走到末尾从头接续)的场景,只要终点索引比起点小,条件从一开始就不成立。
修复方案
方案1:修正循环逻辑
把终止条件改成「当前遍历位置不等于终点就继续走」,不需要额外判断数值大小,适配环形遍历场景:
const weekdays = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; const start = weekdays.indexOf("Sat"); const end = weekdays.indexOf("Tue"); let howManyDays = 0; for (let i = start; i !== end; ) { i = (i + 1) % weekdays.length; howManyDays++; } console.log(howManyDays); // 输出3,结果正确
这个逻辑不管是终点在起点后面(比如周二到周五,结果为3),还是跨了数组末尾(比如周六到周二),都能正常计算。
方案2:公式直接计算(无循环,更简洁)
环形数组两点之间的正向间隔天数可以直接用取模公式计算,不需要遍历,性能更好:
const weekdays = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; const start = weekdays.indexOf("Sat"); const end = weekdays.indexOf("Tue"); // 加数组长度是为了避免终点索引小于起点时出现负数 const howManyDays = (end - start + weekdays.length) % weekdays.length; console.log(howManyDays); // 输出3,结果正确
可以代入其他场景验证:比如周一到周二结果为1,周五到下周一结果为3,周日到下周六结果为6,全部符合常规计数预期。
内容的提问来源于stack exchange,提问作者OhDaeSu
相关产品推荐
相关产品推荐

