Solía tener un switch case simple, como este:
const expr = 'Papayas'; switch (expr) { case 'Oranges': console.log('Oranges'); break; case 'Mangoes': console.log('Mangoes'); break; case 'Papayas': console.log('Papayas'); break; } pero ahora cambiaron algunos criterios y necesito agregar una regla para los tres casos y dejar la funcionalidad anterior como estaba. Entonces, en caso de que tenga Papayas , mi resalt sería All y Papayas . Intenté combinarlo así:
const expr = 'Papayas'; switch (expr) { case 'Oranges': case 'Mangoes': case 'Papayas': console.log('All'); case 'Oranges': console.log('Oranges'); break; case 'Mangoes': console.log('Mangoes'); break; case 'Papayas': console.log('Papayas'); break; } pero eso no funciona correctamente. Siempre obtengo All y Oranges en el resultado. ¿Hay alguna manera de hacerlo con una switch case ?
Puedes hacer algo como esto:
const output = ['All']; switch (expr) { case 'Oranges': output.push('Oranges'); break; case 'Mangoes': output.push('Mangoes'); break; case 'Papayas': output.push('Papayas'); break; } console.log(...output);¿Qué sucede si olvidé un descanso?
Si olvida un descanso, la secuencia de comandos se ejecutará desde el caso en el que se cumple el criterio y se ejecutarán los casos posteriores, independientemente de si se cumplió un criterio. - los documentos de MDN JS en el
switch
Lo que sucede en su caso es que coincide con el case 'Papayas': console.log('All') y luego ejecuta el siguiente case 'Oranges': console.log('Oranges') break; a pesar de no cumplirse; luego viene la break de ese caso; sin esto, también estaría generando Mangoes and Papayas .
La primera solución trivial es simplemente duplicar el console.log('All') en todos los casos de cambio:
switch (expr) { case 'Oranges': console.log('All'); console.log('Oranges'); break; case 'Mangoes': console.log('All'); console.log('Mangoes'); break; case 'Papayas': console.log('All'); console.log('Papayas'); } se puede break el último corte. Una alternativa que requiere el uso de un segundo switch y la duplicación de los case es simplemente ejecutar un switch tras otro:
let val = expr; switch (val) { case 'Oranges': case 'Mangoes': case 'Papayas': console.log('All') } switch (val) { case 'Oranges': console.log('Oranges'); break; case 'Mangoes': console.log('Mangoes'); break; case 'Papayas': console.log('Papayas'); break; } pero me preguntaría si un switch es la construcción de lenguaje apropiada para usar aquí . Un if viene a la mente:
let val = expr; if (val == 'Oranges' || val == 'Mangoes' || val == 'Papayas') { console.log('All'); switch (val) { case 'Oranges': console.log('Oranges'); break; case 'Mangoes': console.log('Mangoes'); break; case 'Papayas': console.log('Papayas'); break; } }Idealmente, puede buscar el mensaje en un diccionario / "objeto" en terminología JS:
const messages = { Oranges: 'Oranges', Mangoes: 'Mangoes', Papayas: 'Papayas' } let message = messages[expr]; if (message) { console.log('All'); console.log(message); }Alternativamente, use funciones de flecha si su código no consiste solo en datos de mapeo -> datos sino datos -> acción:
const funcs = { Oranges: () => console.log('Oranges'), Mangoes: () => console.log('Mangoes'), Papayas: () => console.log('Papayas') } let func = funcs[expr]; if (func) { console.log('All'); func(); }Puede aprovechar la forma en que las declaraciones de selección continuarán después de hacer coincidir el primer elemento si hay una break; no se declara. El siguiente ejemplo utiliza saltos condicionales para generar lo siguiente.
All - Oranges Mangoes and PapayasOrangesAll - Mangoes and PapayasMangoesPapayasInput not recognized. const expr = 'MangPap'; var output = ''; switch (expr) { case 'All': output = 'All - '; case 'Oranges': if ( output.length > 0 ) { output += 'Oranges'; } else { output += 'Oranges'; } if (expr === 'Oranges') { break; } case 'MangPap': if ( output.length > 0 ) { } else { output += 'All - '; } case 'Mangoes': if ( output.length > 0 ) { output += ' Mangoes'; } else { output += 'Mangoes'; } if (expr === 'Mangoes') { break; } case 'Papayas': if ( output.length > 0 ) { output += ' and Papayas'; } else { output += 'Papayas'; } if (expr === 'Papayas') { break; } default: if ( output.length > 0 ) { } else { output += output = 'Input not recognized.'; } } console.log( output );Referencia: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/switch