JavaScript新手求助:正确实现FizzBuzz数组生成函数
解决你的FizzBuzz函数问题
先说说你代码里的几个关键问题:
- 初始化
output = [1, 2, ];根本不是空数组,而且需求是初始添加1,这里直接塞了1和2,逻辑不对 num = num++;是无效自增,num++是先返回当前值再自增,执行后num还是1- 条件判断顺序错误:必须先判断同时被3和5整除的情况,不然会被前面的单条件覆盖
- 每次判断都用
num++,导致每次判断的数字都不一样,逻辑完全混乱 - 用
return output.push(...)会直接返回数组长度,且return后函数终止,没法持续添加元素
下面是修正后的代码,提供两种常用版本:
版本1:生成指定长度的FizzBuzz数组
function fizzBuzz(length) { const output = []; // 从1开始循环到指定长度 for (let num = 1; num <= length; num++) { let item; // 先判断优先级最高的双整除条件 if (num % 3 === 0 && num % 5 === 0) { item = "FizzBuzz"; } else if (num % 3 === 0) { item = "Fizz"; } else if (num % 5 === 0) { item = "Buzz"; } else { item = num; } output.push(item); } return output; } // 示例:生成前15个元素的数组 console.log(fizzBuzz(15));
版本2:支持持续添加元素(每次调用新增一个)
如果要实现“持续添加”的效果,可以用闭包保存状态:
function createFizzBuzz() { const output = [1]; // 初始添加1 let currentNum = 2; // 下一个要判断的数字 return function() { let item; if (currentNum % 3 === 0 && currentNum % 5 === 0) { item = "FizzBuzz"; } else if (currentNum % 3 === 0) { item = "Fizz"; } else if (currentNum % 5 === 0) { item = "Buzz"; } else { item = currentNum; } output.push(item); currentNum++; return [...output]; // 返回数组副本,避免外部修改内部状态 } } // 使用方式 const addFizzBuzz = createFizzBuzz(); console.log(addFizzBuzz()); // [1,2] console.log(addFizzBuzz()); // [1,2,"Fizz"] console.log(addFizzBuzz()); // [1,2,"Fizz",4] console.log(addFizzBuzz()); // [1,2,"Fizz",4,"Buzz"]
关键逻辑说明
- 循环时只用同一个
num值做判断,避免多次自增导致数字混乱 - 先判断双整除条件,确保优先级最高的规则被触发
- 闭包版本通过保存
currentNum和output的状态,实现每次调用添加一个元素的“持续添加”效果
内容的提问来源于stack exchange,提问作者Showgo001
相关产品推荐
相关产品推荐

