Могу ли я использовать оператор case / switch с двумя переменными? - PullRequest
22 голосов
/ 11 февраля 2012

Я новичок в том, что касается JavaScript, и я понял, что использование одного оператора SWITCH / CASE быстрее, чем целая куча операторов IF.

Однако я хочу использовать оператор SWITCH / CASE с двумя переменными.

Мое веб-приложение имеет два ползунка, каждый из которых имеет пять состояний. Я хочу, чтобы поведение основывалось на состояниях этих двух переменных. Очевидно, что это чертовски много утверждений IF / THEN.

Одним из способов, которым я думал об этом, было объединение двух переменных в одну, а затем я мог переключаться между ними.

Есть ли лучший способ выполнить SWITCH / CASE, используя две переменные?

Спасибо!

Ответы [ 8 ]

20 голосов
/ 11 февраля 2012

Как насчет побитового оператора? Вместо строк вы имеете дело с «enums», которые выглядят более «элегантно».

// Declare slider's state "enum"
var SliderOne = {
    A: 1,
    B: 2,
    C: 4,
    D: 8,
    E: 16
};

var SliderTwo = {
    A: 32,
    B: 64,
    C: 128,
    D: 256,
    E: 512
};

// Set state
var s1 = SliderOne.A,
    s2 = SliderTwo.B;

// Switch state
switch (s1 | s2) {
    case SliderOne.A | SliderTwo.A :
    case SliderOne.A | SliderTwo.C :
        // Logic when State #1 is A, and State #2 is either A or C
        break;
    case SliderOne.B | SliderTwo.C :
        // Logic when State #1 is B, and State #2 is C
        break;
    case SliderOne.E | SliderTwo.E :
    default:
        // Logic when State #1 is E, and State #2 is E or
        // none of above match
        break;


}

Я, однако, согласен с другими, 25 случаев в логике переключателей не слишком красивы, и если-бы, в некоторых случаях, "выглядели" лучше Так или иначе.

18 голосов
/ 11 февраля 2012
var var1 = "something";
var var2 = "something_else";
switch(var1 + "|" + var2) {
    case "something|something_else":
        ...
        break;
    case "something|...":
        break;
    case "...|...":
        break;
}

Если у вас есть 5 возможностей для каждого, вы получите 25 случаев.

9 голосов
/ 11 февраля 2012

Во-первых, JavaScript switch не быстрее, чем if/else (а иногда и намного медленнее) .

Во-вторых, единственный способ использовать switch с несколькими переменными - этообъединить их в одно примитивное (строка, число и т. д.) значение:

var stateA = "foo";
var stateB = "bar";
switch (stateA + "-" + stateB) {
    case "foo-bar": ...
    ...
}

Но лично я предпочел бы увидеть набор if / else операторов.

Редактировать : Когда все значения являются целыми числами, оказывается, что переключение может не выполняться, если / еще в Chrome.Смотрите комментарии.

4 голосов
/ 11 февраля 2012

Я не верю, что switch / case работает быстрее, чем серия if / elseif. Они делают то же самое, но если / elseif, вы можете проверить несколько переменных. Вы не можете использовать переключатель / регистр для более чем одного значения.

3 голосов
/ 05 февраля 2015

Если действие каждой комбинации статично, вы можете создать двумерный массив:

var data = [
  [1,2,3,4,5],
  [6,7,8,9,10],
  [11,12,13,14,15],
  [16,17,18,19,20],
  [21,22,23,24,25]
];

Числа в вышеприведенном примере могут быть любыми, такими как строка, массив и т. Д. Извлечение значения теперь является однострочным (при условии, что ползунки имеют диапазон значений [0,5):

var info = data[firstSliderValue][secondSliderValue];
3 голосов
/ 11 февраля 2012

Вы можете присвоить каждой позиции на каждом ползунке различное двоичное значение от 1 до 1000000000, а затем работать с суммой.

1 голос
/ 15 июня 2018

Да, но не по-нормальному.Вы должны будете использовать переключатель в качестве замыкания.

ex: -

function test(input1, input2) {
     switch (true) {
        case input1 > input2:
                    console.log(input1 + " is larger than " + input2);
                    break;
        case input1 < input2:
                    console.log(input2 + " is larger than " + input1);
        default:
                    console.log(input1 + " is equal to " + input2);
      }
   }
0 голосов
/ 31 августа 2018

Да, вы также можете сделать:

    switch (true) {

     case (var1 === true && var2 === true) :
       //do something
       break;
     case (var1 === false && var2 === false) :
       //do something
       break;

      default:

    }

Это всегда будет выполнять переключение, почти так же, как если бы / иначе, но выглядит чище.Просто продолжайте проверять переменные в выражениях регистра.

...