В ответе на этот вопрос, самый популярный В ответе говорится, что это лучший способ сделать это:

switch(variable) {
    case 0:
        // operation A;
    case 1:
        // operation B;
        break;
}

Но что, если операция B ДОЛЖНА быть выполнена до операции A? В этом случае это приемлемо или есть лучшее решение:

switch(variable) {
    case 0:
    case 1:
        // operation B;
        break;
    case 0:
        // operation A;
        break;
}
3
Tara 23 Фев 2018 в 03:16

3 ответа

Лучший ответ

Решения

Чтобы заставить оба случая выполнить процесс B, мы можем перечислить их по порядку без операторов break, а затем использовать оператор if вместо дублирующего оператора case, который вы использовали для выполнения операции не требуется для случая 1.

switch(variable) {
    case 0:
    case 1:
        // operation B;
        if(variable === 0) //operation A ;
        break;

}

Или альтернативно, вложенные функции будут хорошим решением, если процесс B будет предшествовать процессу A независимо от обстоятельств.

process_A = function(){
  process_B();
  console.log("running operation A");
  //operation A;
}
process_B = function(){
  console.log("running operation B");
  //operation B;
}
variable = 0;
switch(variable) {
    case 0:
        process_A();
        break;
    case 1:
        process_B();
        break;
        
}

Объяснение таблиц переключателей и повторяющихся случаев

Не имеет смысла включать повторяющиеся случаи в таблицу переключателей. Только 1 случай будет проиндексирован переменной. Если вам требуются сложные отношения между условиями, вам, вероятно, нужно использовать блоки ifelse или что-то вроде решения Рандо.

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

var variable = 0;
switch(variable) {
    case 0:
        console.log("case 0: No Op performed");
    case 1:
        // operation B;
        console.log("case 1: Op B performed");
        break;
    case 0:
        // operation A;
        console.log("case 0: Op A performed");
        break;
}

Обратите внимание, что операция A никогда не запускается.

Таблица переключателей похожа на массив. Каждый случай - это индекс таблицы, который позволяет нам быстро обрабатывать условия, а не перемещаться линейно вниз по ifelse блокам. Когда мы индексируем таблицу переключателей, мы выполняем все команды от этого индекса до конца таблицы или до первого break

3
Matthew Ciaramitaro 23 Фев 2018 в 01:21

Легко проверить и увидеть, что это не работает так, как вы бы хотели:

function doStuff(x) {
  console.log(`with ${x}:`);
  switch (x) {
    case 0:
    case 1:
      console.log("operation B");
      break;
    case 0:
      console.log("operation A");
      break;
  }
}
doStuff(0);
doStuff(1);

Второе case 0, хотя синтаксически допустимо, никогда не будет достигнуто кодом. В этих случаях обычно лучше комбинировать метки case соответствующим образом, а затем использовать if (или даже больше switch es) для отправки в различные операции.

0
Aurel Bílý 23 Фев 2018 в 00:22

Перерыв заставит вас выйти из переключателя, в таком случае было бы лучше удвоить операцию следующим образом.

switch(variable){
    case 0:
       //operation B
       //Operation A
       break;
    case 1:
       // Operation A
       break;
}

Лучший способ избежать слишком большого дублирования кода - разбить операции A и B на отдельные функции, то есть для коммутатора требуется всего две строки, т.е.

switch(variable){
    case 0:
       this.DoOperationB(variables)
       this.DoOperationA(variables)
       break;
    case 1:
       this.DoOperationA(variables)
       break;
}
3
Rando 23 Фев 2018 в 00:20