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


239

¿Cómo utilizaría una switch casecuando se necesita prueba para una o B en el mismo caso?

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

3
posible duplicado del uso del operador OR en la declaración de cambio de JavaScript : es 100% su pregunta;)
Felix Kling

Encontré que usando comas solo 2 opciones permitían cada caso.
Agus Widiarsa que hice el

Respuestas:


563

Puede usar la caída:

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

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


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".


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.


9

Tienes que cambiarlo!

switch (true) {
    case ( (pageid === "listing-page") || (pageid === ("home-page") ):
        alert("hello");
        break;
    case (pageid === "details-page"):
        alert("goodbye");
        break;
}

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");
}

-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;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.