【问题标题】:JavaScript coding problem called FizzBuzz [closed]称为 FizzBu​​zz 的 JavaScript 编码问题 [关闭]
【发布时间】:2020-01-10 18:26:25
【问题描述】:

我试图找出我在这个问题上做错了什么。我似乎遗漏了一些不允许我的代码工作的东西。我需要使用一个函数来创建一个数组,该数组采用一个数字 n,并循环遍历从数字 1 到 16 的数组,同时还将所有可被 3 整除的数字替换为字符串“fizz”,并且全部可被 5 整除带有单词'buzz',并且任何可以被两者整除的数字都必须替换为字符串'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]

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

[]

【问题讨论】:

  • 将调用函数的结果赋值给results-const results = fizzbuzz(16); console.log(results);
  • 因为var results = []..... 不是const results = []; 你的fizzbuzz 返回了一些东西而你没有使用它。
  • 您在fizzbuzz 函数的inside 创建和操作的results 变量与results 变量outside没有关联> 功能。

标签: javascript function fizzbuzz


【解决方案1】:

您的 fizzbuzz 函数会返回结果,因此只需将其分配给一个变量并记录它:

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

【讨论】:

    【解决方案2】:

    您在函数内部与另一个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);

    【讨论】:

      【解决方案3】:

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

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

      甚至更简单:

      console.log(fizzbuzz(16));
      

      第二个问题是在您的 for 循环中,当您应该创建一个新变量(通常称为 i)时,您正在重新分配 n。当您应该使用变量 n 时,您还可以使用静态数字 (16) 作为表达式 results.length &lt; 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 循环,因为您对两者的使用都有些不正确。

      【讨论】:

        【解决方案4】:

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

        1. 您将变量结果定义了两次,一次为常量,一次为 var。

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

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

          const results = fizzbuzz(16)

        【讨论】:

          【解决方案5】:

          这是我的 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);

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-16
            • 2023-02-06
            • 1970-01-01
            • 2018-07-18
            • 2017-03-19
            • 2016-01-15
            相关资源
            最近更新 更多