You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:52:23