Prueba de múltiples casos en un interruptor, como un OR (||)

Respuestas:

563

Puede usar la caída:

switch (pageid)
{
    case "listing-page":
    case "home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}
kei
fuente
69
Se llama caída .
Felix Kling
2
Descubrí esto antes de publicar la pregunta, pero pensé que sería útil para la comunidad ya que no está bien documentada en ningún lado ... gracias @SLaks por su respuesta también.
Andres
Hola @kei, sé que este no es el lugar adecuado para esto, pero respondiste mi última pregunta correctamente stackoverflow.com/questions/21049005/… ¿Quieres volver a publicar tu respuesta?
Leon Gaban
1
También podría aclarar el punto: una vez que un caso se ha evaluado como verdadero, eso es todo. No se verifican más casos, solo todas las declaraciones ejecutadas hasta el final: es decir, un "corte"; instrucción o si el interruptor se termina.
BeauCielBleu
otros ejemplos aquí en documentos de MDN
Luca Reghellin
118

Como las otras respuestas explicaron cómo hacerlo sin explicar realmente por qué funciona:

Cuando se switchejecuta, encuentra la primera casedeclaración coincidente y luego ejecuta cada línea de código después del cambio hasta que llega a una breakdeclaración o al final de la switch(o una returndeclaración para dejar toda la función que contiene). Cuando omites deliberadamente el breakcódigo para que el siguiente casese ejecute también se llama falla . Entonces, para el requisito del OP:

switch (pageid) {
   case "listing-page":
   case "home-page":
      alert("hello");
      break;

   case "details-page":
      alert("goodbye");
      break;
} 

Olvidar incluir breakdeclaraciones es un error de codificación bastante común y es lo primero que debe buscar si switchno funciona de la manera esperada. Por esa razón, a algunas personas les gusta hacer un comentario para decir "no cumplir" para dejar en claro cuándo se han omitido intencionalmente las declaraciones de ruptura. Lo hago en el siguiente ejemplo, ya que es un poco más complicado y muestra cómo algunos casos pueden incluir código para ejecutar antes de caer:

switch (someVar) {
   case 1:
      someFunction();
      alert("It was 1");
      // fall through
   case 2:
      alert("The 2 case");
      // fall through
   case 3:
      // fall through
   case 4:
      // fall through
   case 5:
      alert("The 5 case");
      // fall through
   case 6:
      alert("The 6 case");
      break;

   case 7:
      alert("Something else");
      break;

   case 8:
      // fall through
   default:
      alert("The end");
      break;
}

También puede (opcionalmente) incluir un defaultcaso, que se ejecutará si ninguno de los otros casos coincide: si no incluye un caso defaulty ninguno coincide, entonces no sucede nada. Puede (opcionalmente) pasar al caso predeterminado.

Entonces, en mi segundo ejemplo, si someVares 1, llamaría someFunction()y luego vería cuatro alertas, ya que cae en varios casos, algunos de los cuales tienen alertas debajo de ellos. Es someVar3, 4 o 5 verías dos alertas. Si someVares 7, vería "Algo más" y si es 8 o cualquier otro valor, vería "El final".

nnnnnn
fuente
44
El // comentario fallido hace que mi phpstorm deje de advertirme sobre la declaración del interruptor fall-through, gracias :)
Getz
Puede usar return en lugar de break si el switch está en una función que llama para devolver algún objeto: switch (action.type) {case ADD: {return newState; } caso DELETE: {return newState; } predeterminado: {estado de retorno; }}
Dominika
14

Necesitas hacer dos caseetiquetas.

El control pasará de la primera etiqueta a la segunda, por lo que ambos ejecutarán el mismo código.

SLaks
fuente
9

Tienes que cambiarlo!

switch (true) {
    case ( (pageid === "listing-page") || (pageid === ("home-page") ):
        alert("hello");
        break;
    case (pageid === "details-page"):
        alert("goodbye");
        break;
}
Stefano Favero
fuente
1
Este método es muy innovador :-) Me gusta por eso. Pero, como usa más personajes que el clásico "fall-through", se vuelve menos interesante :)
AlexLaforge
1
@AlexLaforge lo más extraño e irónico que en otra pregunta de stackouverflow esa respuesta fue totalmente rechazada. Sin embargo, apoyo esta respuesta y estoy de acuerdo, esa es una buena solución para condiciones flexibles.
AlexNikonov
3

Olvídate switchy break, juguemos con if. Y en lugar de afirmar

if(pageid === "listing-page" || pageid === "home-page")

vamos a crear varias matrices con casos y verificarlo con Array.prototype.includes ()

var caseA = ["listing-page", "home-page"];
var caseB = ["details-page", "case04", "case05"];

if(caseA.includes(pageid)) {
    alert("hello");
}
else if (caseB.includes(pageid)) {
    alert("goodbye");
}
else {
    alert("there is no else case");
}
khex
fuente
-6

Usa comas para separar las mayúsculas y minúsculas

switch (pageid)
{
    case "listing-page","home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}
Dinesh
fuente