Perdón por esa tonta pregunta. ¿Cómo puedo usar una condición para un caso en el elemento de idioma de cambio de caso de javascript? Como en el ejemplo siguiente, 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!
if
s, porque tienen razón. Esta es una aplicación terrible deswitch
.var liCount = 2; switch (liCount) { case 0: console.log(0); break; case (liCount<=5 && liCount>0) && liCount: console.log('liCount<=5 && liCount>0'); break; case (liCount<=10 && liCount>5) && liCount: console.log('liCount<=10 && liCount>5'); break; case (liCount>10) && liCount: console.log(liCount); break; }
Respuestas:
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 el paréntesis era el culpable. En verdad, los paréntesis son irrelevantes aquí; lo único que se necesita es que las
switch(true){...}
expresiones de caso se evalúen como booleanos.Funciona porque el valor que le damos al interruptor se utiliza como base para comparar. En consecuencia, las expresiones de caso, que también se evalúan como booleanos, determinarán qué caso se ejecuta. También podría dar la vuelta a esto, pasar
switch(false){..}
y hacer que las expresiones deseadas se evalúen como falso en lugar de verdadero ... pero personalmente prefiero lidiar con condiciones que evalúan la veracidad. Sin embargo, también funciona, por lo que vale la pena tenerlo en cuenta para comprender 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. Luego, el interruptor pasa al siguiente casotrue === (liCount<=5 && liCount>0)
. Esta expresión se evalúa como verdadera, lo que significa que este caso se ejecuta y termina enbreak
. He añadido paréntesis aquí para que quede más claro, pero son opcionales, según la complejidad de su expresión.Es bastante simple y una forma ordenada (si encaja con lo que está tratando de hacer) de manejar una larga serie de condiciones, donde tal vez una larga serie
ìf() ... else if() ... else if () ...
podría introducir mucho ruido visual o fragilidad.Úselo con precaución, porque es un patrón no estándar, a pesar de ser un código válido.
fuente
switch(true) {
, ¿ycase liCount == 0:
no? De lo contrario, esta comparación esliCount == (liCount <=5 && liCount > 0)
.switch(false) {
}Que has manera excesivamente complicada eso. Escríbalo con declaraciones if como esta:
if(liCount == 0) setLayoutState('start'); else if(liCount<=5) setLayoutState('upload1Row'); else if(liCount<=10) setLayoutState('upload2Rows'); $('#UploadList').data('jsp').reinitialise();
O, si ChaosPandion está tratando de optimizar tanto como sea posible:
setLayoutState(liCount == 0 ? 'start' : liCount <= 5 ? 'upload1Row' : liCount <= 10 ? 'upload2Rows' : null); $('#UploadList').data('jsp').reinitialise();
fuente
setLayoutState
: P.Quieres usar declaraciones if:
if (liCount === 0) { setLayoutState('start'); } else if (liCount <= 5) { setLayoutState('upload1Row'); } else if (liCount <= 10) { setLayoutState('upload2Rows'); } $('#UploadList').data('jsp').reinitialise();
fuente
Ver la respuesta de dmp continuación. Eliminaría esta respuesta si pudiera, pero fue aceptada, así que esta es la mejor opción :)
No puedes. Los intérpretes de JS requieren que se compare con la declaración de cambio (por ejemplo, no hay una declaración de "caso cuando"). Si realmente quieres hacer esto, puedes simplemente hacerif(){ .. } else if(){ .. }
bloques.fuente
liCount
. Simplemente estaba señalando que la declaración original de Cwolves de que "los intérpretes de JS requieren que las declaraciones de casos sean valores estáticos" era incorrecta. Desde entonces, cwolves ha revisado esta declaración, por lo que mi comentario ya no es relevante.true
y funciona. Pero tiene más de 3 años, así que realmente no me importa.switch (true) { case condition0: ... break; case condition1: ... break; }
funcionará en JavaScript siempre que sus condiciones devuelvan los
boolean
valores adecuados , pero no tiene muchas ventajas sobre laselse if
declaraciones.fuente
10
en la declaración de cambio? en mi caso no funciona, no estoy seguro de cuál es la razón.10 !== true
, entonces no. ¿Existe alguna variable que pueda tener el valor10
? Six
, entoncescase x === 10:
funcionaría.if (10) {..}
flujo, debe pasar laIf
condición, ¿no es así? porque 10 o cualquier número entero excepto 0 se tratará como un valor de verdad y permitirá entrar en la condición. No estoy seguro de qué tiene de malo el cambio de declaración aquí.switch
simplemente no funciona comoif
.if
prueba si la condición es verdadera .switch
comprueba si la expresión después deswitch
es===
( CaseClauseIsSelected paso 4 ) al valor de la expresión posteriorcase
.Ese es un caso en el que debería usar
if
cláusulas.fuente
Si eso es lo que quiere hacer, sería mejor usar
if
declaraciones. 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();
fuente
Su código no funciona porque no está haciendo lo que 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 número entero, pero la mayoría de las expresiones de su caso se resuelven en un valor booleano.
Entonces, por ejemplo, digamos
liCount = 2
. Tu primer caso no coincidirá, porque2 != 0
. Su segundo caso,(liCount<=5 && liCount>0)
evalúatrue
, pero2 != true
, por lo que este caso tampoco coincidirá.Por este motivo, como han dicho muchos otros, conviene utilizar una serie de
if...then...else if
bloques para hacer esto.fuente
si los valores posibles son números enteros, puede agrupar los casos. De lo contrario, use 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();
fuente
Tenga en cuenta que no pasamos la puntuación al interruptor, sino que es cierto. El valor que le damos al interruptor se utiliza como base para comparar.
El siguiente ejemplo muestra cómo podemos agregar condiciones en el caso: sin ninguna declaración if.
function getGrade(score) { let grade; // Write your code here switch(true) { case score >= 0 && score <= 5: grade = 'F'; break; case score > 5 && score <= 10: grade = 'E'; break; case score > 10 && score <= 15: grade = 'D'; break; case score > 15 && score <= 20: grade = 'C'; break; case score > 20 && score <= 25: grade = 'B'; break; case score > 25 && score <= 30: grade = 'A'; break; } return grade; }
fuente
Aunque en el ejemplo particular de la pregunta del OP
switch
no es apropiado, hay un ejemplo en el que el cambio sigue siendo apropiado / beneficioso, pero también se requieren otras expresiones de evaluación. Esto se puede lograr utilizando la cláusula predeterminada para las expresiones:switch (foo) { case 'bar': // do something break; case 'foo': // do something break; ... // other plain comparison cases default: if (foo.length > 16) { // something specific } else if (foo.length < 2) { // maybe error } else { // default action for everything else } }
fuente