Как выполнить несколько блоков кода с определенными случаями в операторе 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;
}

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


person BoltKey    schedule 27.07.2016    source источник
comment
switch утверждения достаточно сложны. Вы предлагаете изменить то, как они работают на фундаментальном уровне. Почему бы не использовать таблицу сопоставления, в которой вы можете иметь ссылки на функции? { 2: function() { ... } } например.   -  person tadman    schedule 27.07.2016
comment
Что ж, основная причина, по которой я хочу сохранить его в switch, заключается в том, что я построил свой проект на switch операторах, и я не хочу переписывать все это во что-то другое, чтобы иметь возможность делать то, что я описал.   -  person BoltKey    schedule 27.07.2016
comment
То, что вы хотите, и то, что может делать JavaScript, - это две разные вещи. Вы хотите смириться с реальностью или всю жизнь бороться с ней? Если хотите, можете подать петицию группе ECMAScript через TC39. Иногда подход, который мы считаем лучшим, не срабатывает. Учитесь, адаптируйтесь, двигайтесь дальше.   -  person tadman    schedule 27.07.2016


Ответы (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');
}
person Alex Kudryashev    schedule 27.07.2016
comment
Этот тип выполнения называется провалом выполнения, что означает - как я понимаю, и вы это выразились - что без операторов break переключатель найдет первое истинное условие и перейдет к закрывающей скобке переключателя, выполняя каждый случай на пути вниз. Этот тип исполнения присутствует в C #, C ++, Java, javascript и некоторых других, я уверен. VB.net - это язык, который не придерживается общего мнения. - person Richard Barker; 27.07.2016
comment
Хотя этот ответ очень близок к решению проблемы, он все же не позволяет выполнить случай 1 независимо. - person trevor; 27.07.2016

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

Подходит ли мое решение, зависит от вашего определения слова «лучше», но в любом случае вот оно:

Вы можете сделать свой оператор 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;
    }
  }
}
person trevor    schedule 27.07.2016