Как выполнить несколько блоков кода в определенных случаях в операторе switch?

У меня есть заявление о переключении, как это:

switch(a) {
    case 0: 
        // do something
        break;
    case 1:
        // do something else
        break;
}

Что я хочу сделать, это выполнить оба блока кода, когда a == 2 например. Я хотел бы написать что-то вроде этого:

switch(a) {
    case 0: 
    case 2:
        // do something
        break;
    case 1:
    case 2:
        // do something else
        break;
}

но очевидно, что это не работает, потому что первый оператор break завершает весь оператор switch.

Единственным способом, которым я мог придумать, было написание вспомогательных функций:

function case0() {
    // do something
}

function case1() {
    // do something else
}

switch(a) {
    case 0: 
        case0();
        break;
    case 1:
        case1();
        break;
    case 2:
        case0();
        case1();
        break;
}

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

2 ответа

В switch код оператора выполняется, начиная с первого истинного условия до ближайшего break, Так что в вашем случае может сработать следующая конструкция.

var a = 2;//1;//0;//-1;
switch(a){
  case 2: //and also one and zero
    console.log('two');
  case 1: //and also zero
    console.log('one');
  case 0: //zero only
    console.log('zero');
    break;
  default: //no matches
    console.log('default');
}

Вы спросили, есть ли лучший способ достичь того, что вы хотели...

Хорошо, то, подходит ли мое решение, зависит от вашего определения "лучше", но здесь оно так или иначе:

Вы можете сделать свой оператор switch следующим образом:

switch(a) {
  case 0: 
    caseHandler([0]);
    break;
  case 1:
    caseHandler([1]);
    break;
  case 2:
    caseHandler([0,1]);
    break;
}

И передать массив значений в одну вспомогательную функцию, которая использует другой переключатель:

function caseHandler(values) {
  for (var i = 0; i < values.length; i++) {
    switch (values[i]) {
      case 0:
        console.log('doing zero stuff');
        break;
      case 1:
        console.log('doing one stuff');
        break;
    }
  }
}
Другие вопросы по тегам