Можно ли использовать оператор case/switch с двумя переменными?
Я новичок, когда дело доходит до JavaScript, и я понял, что использование одного оператора SWITCH/CASE выполняется быстрее, чем целая группа операторов IF.
Однако я хочу использовать инструкцию SWITCH/CASE с двумя переменными.
В моем веб-приложении есть два ползунка, каждый из которых имеет пять состояний. Я хочу, чтобы поведение было основано на состояниях этих двух переменных. Очевидно, что это целая черта многих утверждений IF/THEN.
Один из способов, который я думал о том, чтобы сделать это, заключался в объединении двух переменных в один, а затем я мог бы использовать SWITCH/CASE.
Есть ли лучший способ выполнить SWITCH/CASE с использованием двух переменных?
Спасибо!
Ответы
Ответ 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];