2014-09-24 4 views
4

В настоящее время я изучаю курс академии в Javascript, и я застреваю в задаче FizzBuzz. Мне нужно пересчитывать от 1 до 20, и если число делится на 3 печати fizz, по 5 печатным жужжанием, печатьми fizzbuzz, иначе просто напечатайте номер. Я смог сделать это с помощью if/else if, но я хотел попробовать его с помощью операторов switch и не могу получить его. Моя консоль только регистрирует значение по умолчанию и печатает 1-20. Какие-либо предложения?javascript fizzbuzz switch statement

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; 
     }; 


}; 

ответ

4

Коммутатор соответствует переключателю x (x) {в результате оценки выражений случая. так как все ваши случаи приведут к истинному/ложному, совпадение не будет, и поэтому значение по умолчанию выполняется всегда.

Теперь использование переключателя для вашей проблемы не рекомендуется, потому что в случае слишком большого количества выражений может быть несколько верных выходов, что дает нам неожиданные результаты. Но если вы одержима на нем:

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; 
    } 

}

+1

Это ужасный код, если бы я столкнулся с ним, я бы его реорганизовал: D – Joeppie

+0

Я поддержал вопрос и ответ, поскольку это помогло мне - в частности, переключатель (true) - но я согласен с @Joeppie с точкой рефакторинга. Первоначальная реакция была разбросана - и пробегала по силовым условным обозначениям, что розеттский код понравился лаконичности - отправил ответ ниже: -? – jamie

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

Я upvoted как вопрос и ответ, как это помогло меня - в частности, часть заявления switch(true). Я пытался сделать оператор switch для fizzbuzz. Мое решение включает стиль кодирования Rosettacodes link to that solution - общее решение. Наиболее важно использование силового ввода для сокращения первичных условностей. Я думал, что это достаточно ценно для публикации.

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); 
    } 
    } 
} 
1

Я думал, что переключатель тоже, но не нужно.

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); 
} 
+0

Мне нравится это решение, действительно чистое. – sanjsanj

0

Вот некоторые псевдо-код на пути, чтобы сделать это:

for i in 0...20 { 
    var mod = i % 15 
    switch mod { 
    case 0: 
     print("FizzBuzz") 
     break 
    case 3,6,9,12: 
     print("Fizz") 
     break 
    case 5,10: 
     print("Buzz")  
    default: 
     print(i) 
    } 
} 
0

Вот что сделал это для меня ясно, может помочь: Это неправильное толкование, что такое «переключатель (х) {}» означает.

Это не означает: «всякий раз, когда бы я ни вставал между этими скобками, это правда, когда изменяется значение x».
Это означает: «всякий раз, когда х РАВНО, что я ставлю между этими скобками»

Таким образом, в нашем случае, не х НЕ равен «х% 3 === 0» или любой из других случаев, что даже не означает, что-нибудь. x просто равно x все время. Вот почему машина просто игнорирует инструкцию. Вы не переопределяете x с помощью функции переключения. И то, что вы поставили между скобками, описывает только x и x, а не что-то, связанное с x.

Вкратце:
С помощью «if/else» вы можете описать любое состояние.
С помощью «переключателя» вы можете описывать только разные значения, принимаемые переменной x.