如何修正JavaScript函数以生成不超过指定数值的3的倍数数组
解决思路与修复方案
嘿,我来帮你理清问题出在哪,以及怎么快速修复~
首先看你代码里的核心bug:循环条件用了动态变化的array.length。每次执行array.push(i)都会让数组长度加1,导致循环根本不会在i到达20时停止,反而会一直跑下去(直到环境强制中断),这就是为什么你会得到21、24这些超过传入参数num的数值。
另外还有几个没必要的冗余操作和小问题:
i没有用let/const声明,会变成全局变量,容易引发其他意外问题- 一开始设置
array.length = num再用splice(0, num)删掉空元素完全是多余的,直接初始化空数组就行 else i;这行代码没有任何实际作用,可以直接删掉
修复方案1:直观遍历判断
最容易理解的写法,直接遍历1到num的所有数,把能被3整除的加入数组:
function justThreesUpTo(num) { const array = []; // 循环范围明确限制为1到num(包含num) for (let i = 1; i <= num; i++) { if (i % 3 === 0) { array.push(i); } } return array; }
调用justThreesUpTo(20)会得到[3, 6, 9, 12, 15, 18],完全符合要求。
修复方案2:高效生成倍数
不需要遍历每个数,直接生成3的倍数,循环次数更少,性能更优:
function justThreesUpTo(num) { const array = []; // 从第一个3的倍数开始,每次加3,直到不超过num for (let i = 3; i <= num; i += 3) { array.push(i); } return array; }
修复方案3:函数式简洁写法
如果喜欢更简洁的函数式风格,可以用Array.from结合过滤:
function justThreesUpTo(num) { // 生成1到num的数组,过滤出能被3整除的元素 return Array.from({ length: num }, (_, idx) => idx + 1).filter(n => n % 3 === 0); }
内容的提问来源于stack exchange,提问作者davedub
相关产品推荐
相关产品推荐

