JavaScript 名为 FizzBu​​zz 的编码问题

JavaScript coding problem called FizzBuzz

我想弄清楚我在这个问题上做错了什么。我似乎遗漏了一些不允许我的代码工作的东西。我需要使用一个函数来创建一个数组,该数组采用一个数字 n,并从数字 1 到 16 循环遍历一个数组,同时还用字符串 'fizz' 替换所有可被 3 整除的数字,并且所有可整除的数字用单词 'buzz' 乘以 5,任何可被两者整除的数字都必须替换为字符串 'fizzbuzz'。

我已经检查过这个问题好几次了,但出于某种原因,当我的结果被记录到控制台时,我的结果一直只是一个空数组。如果有人能给我一些关于为什么我的代码不起作用的提示,以便我可以更容易地理解这个概念,我将不胜感激。这是我的代码:

const results = [];

const fizzbuzz = (n) => {
  var results = []
  for (let n = 1; results.length < 16; n++) {
    if (n % 3 === 0 && n % 5 === 0) {
      results.push('FizzBuzz')
    } else if (n % 3 === 0) {
      results.push('fizz');
    } else if (n % 5 === 0) {
      results.push('buzz')
    } else {
      results.push(n)
    }
  }
  return results
};

fizzbuzz(16);
console.log(results);

结果应该是这样的:

[1, 2, 'fizz', 4, 'buzz', 'fizz', 7, 8, 'fizz', 'buzz', 11, 'fizz', 13, 14, 'fizzbuzz', 16]

但这就是我不断得到的答案:

[]

你的 fizzbuzz 函数 returns 结果,所以只需将其分配给一个变量并记录它:

var results = fizzbuzz(16);
console.log(results);

您的第一个问题是在函数外部声明的 results 变量和在函数内部声明的 results 变量是完全不同的变量。你只需要在函数中声明变量,然后你可以创建一个新的变量来保存函数结果:

const res = fizzbuzz(16);
console.log(res);

或更简单:

console.log(fizzbuzz(16));

第二个问题是在你的 for 循环中,当你应该创建一个新变量(通常称为 i)时,你正在重新分配 n。当您应该使用变量 n:

时,您还使用静态数字 (16) 作为表达式 results.length < 16 中的限制
  for (let i = 0; results.length < n; i++) {
    if (i % 3 === 0 && i % 5 === 0) {
      results.push('FizzBuzz')
    } else if (i % 3 === 0) {
      results.push('fizz');
    } else if (i % 5 === 0) {
      results.push('buzz')
    } else {
      results.push(i)
    }
  }

总的来说,您采用了正确的方法,但您应该检查变量和 for 循环,因为您对它们的使用有点不正确。

您正在函数内部玩另一个 results,函数外部 result 将保持为空。如果现在删除函数内部的变量,则每个操作都将针对同一个变量。

const results = [];

const fizzbuzz = (num) => {

  for(let n=1; n<num; n++){
    if(n%3 === 0 && n % 5 === 0){
     results.push('FizzBuzz')
    } 
    else if(n % 3 === 0){
     results.push('fizz'); 
    } 
    else if(n % 5 === 0){
      results.push('buzz')
    }
    else { 
      results.push(n)
    }
  }

};

fizzbuzz(16);
console.log(results);

您的代码有两个明显的问题。

  1. 你定义变量results两次,一次是常量,一次是var。

如果删除 var results = [] 定义,您的代码将正常工作,因为它能够通过闭包存储结果。基本上,const 结果的范围封装了函数的范围,因此您的函数可以访问 const results = []

  1. 您的函数未返回任何内容。如果您试图通过闭包存储结果,这不会成为问题,但查看您的代码,这不是您的意图。你应该做的是将结果存储在一个变量中,如

    const results = fizzbuzz(16)

这是我的 FizzBu​​zz 实现,它根据规则使用 Array.from() 生成带有 fizz/buzz/number 的数组:

const fizzbuzz = length => Array.from({ length }, (_, i) => {
  if (i % 3 === 0 && i % 5 === 0) return 'FizzBuzz';
  
  if (i % 3 === 0) return 'fizz';
  
  if (i % 5 === 0) return 'buzz';
  
  return i;
})

const results = fizzbuzz(16); // assign the return value of the function to results
console.log(results);