javascript fizzbuzz switch 语句

问题描述 投票:0回答:9

我目前正在参加关于 Javascript 的代码学院课程,并且我被 FizzBuzz 任务困住了。我需要从 1 到 20 数,如果这个数字可以被 3 print fizzbuzz 整除,可以被 5 print buzz 整除,可以被两个 print fizzbuzz 整除,否则就打印这个数字。我可以使用 if/else if 语句来做到这一点,但我想尝试使用 switch 语句,但无法得到它。我的控制台仅记录默认值并打印 1-20。有什么建议么?

for (var x = 0; x<=20; x++){
        switch(x){
            case x%3==0:
                console.log("Fizz");
                break;
            case x%5===0:
                console.log("Buzz");
                break;
            case x%5===0 && x%3==0:
                console.log("FizzBuzz");
                break;
            default:
                console.log(x);
                break;
        };


};
javascript switch-statement fizzbuzz
9个回答
11
投票

Switch 将 switch(x){ 中的 x 与 case 表达式的求值结果相匹配。由于所有情况都会导致 true / false ,因此没有匹配项,因此始终执行默认值。

现在不建议使用 switch 来解决您的问题,因为如果表达式太多,可能会有多个 true 输出,从而给我们带来意想不到的结果。但如果你一心一意:

for (var x = 0; x <= 20; x++) {
  switch (true) {
    case (x % 5 === 0 && x % 3 === 0):
        console.log("FizzBuzz");
        break;
    case x % 3 === 0:
        console.log("Fizz");
        break;
    case x % 5 === 0:
        console.log("Buzz");
        break;
    default:
        console.log(x);
        break;
  }

}


2
投票

我也想换,但没必要。

    for (var n = 1; n <= 100; n++) {
  var output = "";  
  if (n % 3 == 0)
    output = "Fizz";
  if (n % 5 == 0)
    output += "Buzz";
  console.log(output || n);
}

2
投票

Switch 语句检查 case 中给出的情况是否与 switch 表达式匹配。您的代码所做的是比较 x 除以 3 或 5 是否等于 x ,这始终为 false,因此始终执行默认值。如果你真的想使用 switch 语句,这里是你可以做的一种方法。

for (var i=1; i<=30; i++){
  switch(0){
    case (i % 15):
      console.log("fizzbuzz");
      break;
    case (i % 3):
      console.log("fizz");
      break;
    case (i % 5):
      console.log("buzz");
      break;
    default:
      console.log(i);
  }
}

0
投票

不要太自吹自擂,但这更干净:

var numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
for (var i = 1; i <= numbers.length; i++) {  
    if (i % 15 === 0) {
        console.log("FizzBuzz");
    } else if (i % 5 === 0) {
        console.log("Buzz");
    } else if (i % 3 === 0) {
        console.log("Fizz");
    } else {
        console.log(i);
    }
};

0
投票

此声明

switch(true)部分对我有帮助。我试图为 fizzbuzz
 做一个 switch 语句。我的解决方案结合了 Rosettacodes
的编码风格 - 通用解决方案。最重要的是使用强制键入来缩短主要条件。我想,它很有价值,值得发帖:

var fizzBuzzSwitch = function() { for (var i =0; i < 101; i++){ switch(true) { case ( !(i % 3) && !(i % 5) ): console.log('FizzBuzz'); break; case ( !(i % 3) ): console.log('Fizz'); break; case ( !(i % 5) ): console.log('Buzz'); break; default: console.log(i); } } }
    

0
投票
这对我来说很清楚,可能会有所帮助: 这是对

switch (x){}

 含义的误解。 

这并不意味着:“每当我在这些括号之间放入true

时,当
x
的值发生变化时。”
它的意思是:“只要
x
 等于我放在括号之间的内容”

因此,在我们的例子中,

x

永远不等于
x%3===0
或任何其他情况,这甚至没有任何意义。 
x
 始终等于 
x
。这就是为什么机器会忽略该指令。您没有使用 switch 函数重新定义 
x
。括号内的内容仅描述 
x
x
,而不是与 
x
 相关的任何内容。 

简而言之:

使用
if/else

 您可以描述任何情况。
使用
switch
,您只能描述变量 
x
 所取的不同值。 


0
投票
这是一个结合了@CarLuvr88的答案和0开关的解决方案:

let fizzBuzz = function(min, max){ for(let i = min; i <= max; i++){ switch(0){ case i % 15 : console.log('FizzBuzz'); break; case i % 3 : console.log('Fizz'); break; case i % 5 : console.log('Buzz'); break; default : console.log(i); break; } } } fizzBuzz(1,20)


0
投票
我们可以使用一个函数来查找任意数字的倍数,并声明两个变量来标识这些倍数,这样如果你想更改倍数,最多只需要更改 2 行代码

function isMultiple(num, mod) { return num % mod === 0; } let a = 3; let b = 5; for(i=0;i<=100;i++){ switch(true){ case isMultiple(i,a) && isMultiple(i,b): console.log("FizzBuzz") case isMultiple(i,a): console.log("Fizz"); case isMultiple(i,b): console.log("Buzz"); default: console.log(i); } }
    

0
投票
在打字稿中可以按如下方式完成:

const range = (startingNumber: number, endingNumber: number): number[] => Array.from({ length: endingNumber - startingNumber + 1 }, (_, index) => startingNumber + index); const isDivisibleBy = (input: number, divisor: number): boolean => input % divisor === 0; const fizzBuzzOutput = (input: number): string => isDivisibleBy(input, 3) && isDivisibleBy(input, 5) ? "FizzBuzz" : isDivisibleBy(input, 3) ? "Fizz" : isDivisibleBy(input, 5) ? "Buzz" : input.toString(); const fizzBuzz = (startingNumber: number, endingNumber: number): string[] => range(startingNumber, endingNumber).map(fizzBuzzOutput); const answer = fizzBuzz(1, 20); console.log(answer);
    
© www.soinside.com 2019 - 2024. All rights reserved.