Zack
Zack

Reputation: 671

What's wrong with this nested switch statement?

This statement is returning all the numbers from 1-100, but is not applying fizz-buzz rules. Not sure why. Can you offer an explanation?

for (var number = 1; number <= 100; number++) {
  switch(number) {
  case number % 3 == 0:
    console.log('Fizz');
    break;
  case number % 5 == 0:
    console.log('Buzz');
    break;
  case number % 5 == 0 && number % 3 == 0:
    console.log('FizzBuzz');
    break;
  default:
    console.log(number);
    break;
  }
}

Upvotes: 0

Views: 162

Answers (3)

brisky
brisky

Reputation: 197

number is matched against expression of case so if number is 3, it does not match "number % 3 == 0" because "number % 3 == 0" is true, not 3

Upvotes: 1

TheGoatMan7
TheGoatMan7

Reputation: 610

Your code will never reach the case:

case number % 5 == 0 && number % 3 == 0

because it will have already made it into the first case:

case number % 3 == 0:

One way around this would be to change the statements to:

case number % 3 == 0 && number % 5 != 0
case number % 5 == 0 && number % 3 != 0

Upvotes: -1

Guffa
Guffa

Reputation: 700562

You are comparing the number with boolean expressions. The switch would be equivalent with:

if (number == (number % 3 == 0)) {
  console.log('Fizz');
} else if (number == (number % 5 == 0)) {
  console.log('Buzz');
} else if (number == (number % 5 == 0 && number % 3 == 0)) {
  console.log('FizzBuzz');
} else {
  console.log(number);
}

Use if statements instead of a switch, and check the double condition first:

if (number % 5 == 0 && number % 3 == 0) {
  console.log('FizzBuzz');
} else if (number % 3 == 0) {
  console.log('Fizz');
} else if (number % 5 == 0) {
  console.log('Buzz');
} else {
  console.log(number);
}

Upvotes: 4

Related Questions