PDA

Просмотр полной версии : switch по нескольким параметрам


angeldark
26.10.2008, 18:39
как сделать так, чтобы в switch задействовать сразу несколько параметров. К примеру, есть 2 параметра a и b.
switch (a и b) {
case a=1&b=1:
function 1;
break;
case a=0&a=0:
function 2;
break;
}
как это реализовать?

laurisgutmanis
26.10.2008, 18:45
просто:

if(a == 1 && b ==1){
function 1;
}elseif(a == 0 && b == 0){
function 2;
}


Case && IF работают одинаково

angeldark
26.10.2008, 19:22
а если 5 параметров? и соответственно 2^5 различных состояний?

laurisgutmanis
26.10.2008, 19:26
if(a == 1 && b ==1 && b2 ==1 && b3 ==1 && b4 ==1){
function 1;
}elseif(a == 0 && b == 0){
function 2;
}

angeldark
26.10.2008, 19:38
тогда уж
if(a == 1 && b ==1 && b2 ==1 && b3 ==1 && b4 ==1){
function 1;
}elseif(a == 1 && b ==1 && b2 ==1 && b3 ==1 && b4 ==0){
function 2;
}elseif(a == 1 && b ==1 && b2 ==1 && b3 ==0 && b4 ==1){
function 3;
}elseif(a == 1 && b ==1 && b2 ==1 && b3 ==0 && b4 ==0){
function 4;
}elseif(a == 1 && b ==1 && b2 ==0 && b3 ==1 && b4 ==1){
function 5;
}
и т.д.
а это имхо не очень удобно. Через case лучше.
при том, что у меня реализовано так, что 1 и undefined по сути одно и тоже, ибо при undefined те же действия, что и при 1. А значит, что количетво состояний возрастает вдвое

laurisgutmanis
26.10.2008, 19:51
ну тогда уж так:


thisMonth = 'jan';
otherMonth = 'jan';

switch (true) {
case (thisMonth == 'jan' && otherMonth == 'jan'):
trace("January");
break;
case (thisMonth == 'feb' && otherMonth == 'feb'):
trace("February");
break;

default :
trace("default func");
}

silin
26.10.2008, 20:22
в switch'е, как и в if'е всегда одно условие
да и писать 2^5 case'ов - то еще удовольствие..

как вариант
var a = 1, b = 0, c = 1;
//var a = 0, b = 0, c = 1;
this["f" + a + b + c]();
function f101() {trace("101");}
function f001() {trace("001");}

angeldark
26.10.2008, 22:54
в switch'е, как и в if'е всегда одно условие
в if'e можно комбинировать условия. я конечно не уверен, что бесконечно много, но десяток вполне возможно. Так что ты не прав (по крайней мере в отношенни if'a)

laurisgutmanis
26.10.2008, 22:59
this["f" + a + b + c]();


крута!
Насколько такая конструкция быстрее if работает?
Не тормозится ли из-за того что происходит определение из переменных?

silin
26.10.2008, 23:31
>>в if'e можно комбинировать условия
логические операции конечно никто не отменял, но if же берет их результат: с равным успехом эту комбинацию можно вычислить и предварительно

>>Насколько такая конструкция быстрее if работает?
не проверял, потому как на деле не доводилось так извращаться :)
на вскидку тормозить здесь особо нечему
что мешает проверить, если интересно

Жень Шень
27.10.2008, 11:49
Привет
Если параметры принимают значения 1 или 0, то можно так:
function mySyperPuperFunction(a, b, c, d) {
var z;
z = (a << 3)+(b << 2)+(c << 1)+d;
switch (z) {
case 0 :
trace(0);
//function0();
break;
case 1 :
trace(1);
//function1();
break;
case 2 :
trace(2);
//function2();
break;
case 3 :
trace(3);
//function2();
break;
}
// итд
}
//проверка
mySyperPuperFunction(0, 0, 0, 0);
mySyperPuperFunction(0, 0, 0, 1);
mySyperPuperFunction(0, 0, 1, 0);
mySyperPuperFunction(0, 0, 1, 1);