2016-07-27 2 views
0

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

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

+1

Выражения 'switch' достаточно сложны. То, что вы предлагаете, - это изменение того, как они работают на фундаментальном уровне. Почему бы не использовать таблицу сопоставления, где вы можете иметь ссылки на функции? '{2: function() {...}}' например. – tadman

+0

Ну, основная причина, по которой я хочу сохранить его в 'switch', - это то, что я построил свой проект на операторах' switch', и я не хочу переписывать все это во что-то другое, просто чтобы иметь возможность делать то, что я описал. – BoltKey

+0

Что вы хотите и что может сделать JavaScript, это две разные вещи. Вы хотите сгибаться к реальности или тратить свою жизнь на борьбу с ней? Вы можете [просить группу ECMAScript через TC39] (https://tc39.github.io/process-document/), если хотите. Иногда подход, который мы считаем лучшим, не ограничивается. Изучайте, адаптируйте, двигайтесь дальше. – tadman

ответ

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

Этот тип исполнения называется падением через значение выполнения - как я понимаю, и вы положили его - без инструкций break коммутатор найдет первое истинное условие и пройдёт до закрывающей скобки коммутатора, выполняющего каждый случай по пути вниз. Этот тип исполнения присутствует в C#, C++, Java, javascript и некоторых других, я уверен. VB.net - это один язык, который не придерживается общего консенсуса. –

+0

Несмотря на то, что этот ответ очень близок к решению проблемы, он по-прежнему не позволяет случай 1 выполнять независимо. – trevor

0

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

Ну, квалифицируется ли не мое решение зависит от вашего определения «лучше», но здесь это в любом случае:

Вы можете сделать свой переключатель заявление, как это:

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; 
    } 
    } 
} 
Смежные вопросы