strings - switch javascript ejemplos
javascript: usando una condiciĆ³n en caso de cambio (9)
Ese es un caso en el que deberías usar cláusulas if
.
Esta pregunta ya tiene una respuesta aquí:
- Conmutador condicional de Javascript 4 respuestas
Lo siento por esa pregunta tonta. ¿Cómo puedo usar una condición para un caso en el elemento de lenguaje javascript switch-case? Como en el ejemplo a continuación, un caso debe coincidir cuando la variable liCount
es <= 5 y> 0; Sin embargo, mi código no funciona:
switch (liCount) {
case 0:
setLayoutState(''start'');
var api = $(''#UploadList'').data(''jsp'');
api.reinitialise();
break;
case (liCount<=5 && liCount>0):
setLayoutState(''upload1Row'');
var api = $(''#UploadList'').data(''jsp'');
api.reinitialise();
break;
case (liCount<=10 && liCount>5):
setLayoutState(''upload2Rows'');
var api = $(''#UploadList'').data(''jsp'');
api.reinitialise();
break;
case (liCount>10):
var api = $(''#UploadList'').data(''jsp'');
api.reinitialise();
break;
}
Gracias por cualquier consejo!
Esto funciona:
switch (true) {
case liCount == 0:
setLayoutState(''start'');
var api = $(''#UploadList'').data(''jsp'');
api.reinitialise();
break;
case liCount<=5 && liCount>0:
setLayoutState(''upload1Row'');
var api = $(''#UploadList'').data(''jsp'');
api.reinitialise();
break;
case liCount<=10 && liCount>5:
setLayoutState(''upload2Rows'');
var api = $(''#UploadList'').data(''jsp'');
api.reinitialise();
break;
case liCount>10:
var api = $(''#UploadList'').data(''jsp'');
api.reinitialise();
break;
}
Una versión anterior de esta respuesta consideraba que los paréntesis eran los culpables. En verdad, los paréntesis son irrelevantes aquí - lo único necesario es switch(true){...}
y para que las expresiones de su caso se evalúen a booleanos.
Funciona porque el valor que le damos al conmutador se usa como base para comparar. En consecuencia, las expresiones de caso, que también evalúan a booleanos determinarán qué caso se ejecuta. También podría cambiar esto y pasar el switch(false){..}
y hacer que las expresiones deseadas se evalúen como falsas en lugar de verdaderas ... pero personalmente prefiero lidiar con las condiciones que evalúan la veracidad. Sin embargo, también funciona, así que vale la pena tenerlo en cuenta para entender lo que está haciendo.
Por ejemplo: si liCount es 3, la primera comparación es true === (liCount == 0)
, lo que significa que el primer caso es falso. El interruptor luego pasa al siguiente caso true === (liCount<=5 && liCount>0)
. Esta expresión se evalúa como verdadera, lo que significa que este caso se ejecuta y finaliza en la break
. He agregado paréntesis aquí para hacerlo más claro, pero son opcionales, dependiendo de la complejidad de su expresión.
Es bastante simple y una forma clara (si encaja con lo que está tratando de hacer) de manejar una larga serie de condiciones, donde quizás una larga serie de ìf() ... else if() ... else if () ...
podría introducir mucho ruido visual o fragilidad.
Utilícelo con precaución, ya que es un patrón no estándar, a pesar de ser un código válido.
Quieres usar las sentencias if:
if (liCount === 0) {
setLayoutState(''start'');
} else if (liCount <= 5) {
setLayoutState(''upload1Row'');
} else if (liCount <= 10) {
setLayoutState(''upload2Rows'');
}
$(''#UploadList'').data(''jsp'').reinitialise();
Si eso es lo que quieres hacer, sería mejor usar las sentencias if
. Por ejemplo:
if(liCount == 0){
setLayoutState(''start'');
}
if(liCount<=5 && liCount>0){
setLayoutState(''upload1Row'');
}
if(liCount<=10 && liCount>5){
setLayoutState(''upload2Rows'');
}
var api = $(''#UploadList'').data(''jsp'');
api.reinitialise();
Si los valores posibles son enteros, puedes agrupar los casos. De lo contrario, utilice ifs.
var api, tem;
switch(liCount){
case 0:
tem= ''start'';
break;
case 1: case 2: case 3: case 4: case 5:
tem= ''upload1Row'';
break;
case 6: case 7: case 8: case 9: case 10:
tem= ''upload2Rows'';
break;
default:
break;
}
if(tem) setLayoutState((tem);
api= $(''#UploadList'').data(''jsp'');
api.reinitialise();
Su código no funciona porque no está haciendo lo que usted espera que haga. Los bloques de interruptores toman un valor y comparan cada caso con el valor dado, buscando la igualdad. Su valor de comparación es un entero, pero la mayoría de las expresiones de su caso se resuelven en un valor booleano.
Entonces, por ejemplo, diga liCount = 2
. Tu primer caso no coincidirá, porque 2 != 0
. Su segundo caso, (liCount<=5 && liCount>0)
evalúa como true
, pero 2 != true
, por lo que este caso tampoco coincidirá.
Por esta razón, como muchos otros han dicho, debes usar una serie de if...then...else if
bloques para hacer esto.
Usted ha complicado demasiado eso. Escríbelo con declaraciones if en lugar así:
if(liCount == 0)
setLayoutState(''start'');
else if(liCount<=5)
setLayoutState(''upload1Row'');
else if(liCount<=10)
setLayoutState(''upload2Rows'');
$(''#UploadList'').data(''jsp'').reinitialise();
O, si ChaosPandion intenta optimizar todo lo posible:
setLayoutState(liCount == 0 ? ''start'' :
liCount <= 5 ? ''upload1Row'' :
liCount <= 10 ? ''upload2Rows'' :
null);
$(''#UploadList'').data(''jsp'').reinitialise();
Vea la respuesta de dmp a continuación. Eliminaría esta respuesta si pudiera, pero fue aceptada, así que esta es la mejor opción :)
Usted no puede Los intérpretes de JS requieren que compare con la instrucción de cambio (por ejemplo, no hay una declaración de "caso cuando"). Si realmente quieres hacer esto, puedes hacer que if(){ .. } else if(){ .. }
bloquee.
switch (true) {
case condition0:
...
break;
case condition1:
...
break;
}
funcionará en JavaScript siempre que sus condiciones devuelvan valores boolean
adecuados, pero no tiene muchas ventajas sobre else if
declaraciones else if
.