Подтвердить что ты не робот

Можно ли использовать оператор case/switch с двумя переменными?

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

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

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

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

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

Спасибо!

4b9b3361

Ответ 1

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

// Declare slider 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 случаев в логике switch-case не слишком красивы, а if-else может в некоторых случаях "выглядеть" лучше. Так или иначе.

Ответ 2

var var1 = "something";
var var2 = "something_else";
switch(var1 + "|" + var2) {
    case "something|something_else":
        ...
        break;
    case "something|...":
        break;
    case "...|...":
        break;
}

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

Ответ 3

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

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

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

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

Изменить. Когда все значения являются целыми числами, появляется сообщение о том, что коммутатор может выйти из if/else в Chrome. См. Комментарии.

Ответ 4

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

Ответ 5

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

Ответ 6

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

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];