
本文详解 CodeWars JavaScript 题目 findMultiples(integer, limit) 的常见错误与正确解法:重点指出全局数组导致的测试失败问题,并提供简洁、健壮、可复用的函数实现。
本文详解 codewars javascript 题目 `findmultiples(integer, limit)` 的常见错误与正确解法:重点指出全局数组导致的测试失败问题,并提供简洁、健壮、可复用的函数实现。
在 CodeWars 的这道基础题中,你需要编写一个函数 findMultiples(integer, limit),它接收两个正整数参数:integer(基准数)和 limit(上限值),并返回一个包含 integer 所有正倍数(≤ limit)的数组,且 limit 若为 integer 的倍数,也需包含在内。
你原始代码的核心问题在于:将数组 arr 声明在函数外部(全局作用域)。这导致每次调用 findMultiples 时,arr 都会持续累积结果——而 CodeWars 的测试套件会连续多次调用该函数(如 findMultiples(4,19)、findMultiples(5,25)、findMultiples(1,8)),因此后续调用会把新结果追加到前一次的 arr 后面,造成 [4,8,12,16,5,10,15,20,25,...] 这类污染输出,最终返回 undefined(因无 return 语句)或非预期数组,导致测试失败。
✅ 正确做法是:在函数内部声明并初始化空数组,计算完成后直接 return 它。同时,逻辑可大幅简化——无需分别判断 limit 是否能被整除。只需从 i = 1 开始,逐次生成 i * integer,直到该值超过 limit 即可停止。
以下是优化后的标准解法(含注释):
function findMultiples(integer, limit) {
const result = []; // ✅ 每次调用都创建全新数组
for (let i = 1; ; i++) {
const multiple = i * integer;
if (multiple > limit) break; // 超出上限,终止循环
result.push(multiple);
}
return result; // ✅ 必须显式返回数组
}
更简洁的函数式写法(推荐):
function findMultiples(integer, limit) {
const count = Math.floor(limit / integer); // 最大倍数序号
return Array.from({ length: count }, (_, i) => (i + 1) * integer);
}
? 关键注意事项:
- ❌ 禁止使用全局变量存储结果;
- ✅ 每次调用必须返回新创建的数组;
- ✅ 不需要处理 integer = limit 的边界(题目明确保证输入为正整数且 limit > integer);
- ✅ 无需 console.log —— 测试环境不依赖控制台输出,反而可能干扰判断;
- ✅ 函数必须有 return 语句,否则默认返回 undefined,导致 “expected undefined to be an array” 错误。
通过以上修正,你的函数将稳定通过所有测试用例,包括基础测试、随机测试及边界验证(如 findMultiples(1, 8) → [1,2,3,4,5,6,7,8])。记住:纯函数、无副作用、输入决定输出,是解决此类算法题的根本原则。










