Cómo acortar una larga declaración if else

Estoy intentando descubrir cómo puedo simplificar una posible declaración larga si no.

Hay 8 posibilidades que se pueden elegir y para cada opción 1-8 quiero mostrar un mensaje.

Por ejemplo, esto es lo que funciona, pero sé que puede escribirse mucho mejor:

if(this.cv == '1'){ 
 console.log('Greater Then 1');
} else
if(this.cv == '2'){
 console.log('Greater Than 2');
}

etc. ...

Buscando algo un poco más dinámico.

0
Esta pregunta parece estar fuera de tema porque se trata de una revisión del código: codereview.stackexchange.com .
agregado el autor lifetimes, fuente
si solo necesita una búsqueda one-one, no hay necesidad de cambiar, que es más lento que un LUT: console.log ({1: 'gt one', 2: 'gt two'} [this.cv])
agregado el autor dandavis, fuente

8 Respuestas

Esto es para lo que se creó la declaración switch .

switch(this.cv) {
case '1':
    console.log("Greater than 1");
    break;
case '2':
    console.log("Greater than 2");
    break;
}

Incluso puede agregar una acción predeterminada "catch-all":

default:
    console.log("I don't know what to do with "+this.cv);
0
agregado
switch(n)
{
case '1':
  execute code block 1
  break;
case '2':
  execute code block 2
  break;
default:
  code to be executed if n is different from case 1 and 2
}
0
agregado

Usa un mapa:

var messages = {
    '1' : 'Greater than 1',
    '2' : 'Greater than 2',
   ....etc
}

console.log(messages[this.cv]);
0
agregado
@dandavis Internamente, esto es más o menos lo que hace el switch , pero con un bloque de instrucciones en lugar de solo una cadena.
agregado el autor Niet the Dark Absol, fuente
¡Gracias esto realmente es útil!
agregado el autor TikaL13, fuente
@ TikaL13 - ¡No hay problema, feliz de ayudar!
agregado el autor adeneo, fuente
No podría haberlo dicho mejor, aunque lo intenté ... ¿por qué ejecutar muchas comparaciones en un cambio cuando puedes ejecutar una resolución de nombre en su lugar?
agregado el autor dandavis, fuente
switch evalúa cada caso, por ejemplo: switch (true), un objeto no lo hace. banco en caso de duda.
agregado el autor dandavis, fuente

Si ese es el formato exacto de su mensaje (para todos los casos), entonces simplemente podría escribir:

console.log('Greater Than ' + this.cv);

Sin embargo, si necesita más flexibilidad en cada caso, puede usar una instrucción cambiar como otras respuestas han sugerido.

0
agregado

Depende a veces de que tenga muchas funciones para agregar a varias variables.

en ese caso, prefiero usar algo así. creo un objeto con las respuestas luego verifico si la respuesta existe y la ejecuto. prefiero ese sobre el cambio

var a={'2':'greater than 2','1':'greater than 1'}
console.log(a[this.cv]?a[this.cv]:'')

Otra foma de escribir esto es

 var a={'2':'greater than 2','1':'greater than 1'}
 !a[this.cv]||(console.log(a[this.cv]));

o si solo tienes que hacer un cheque coto, uso taquigrafía de JavaScript.

console.log('Greater then '+(a=this.cv,a==1)?1:(a==2)?2:'whatever');

o

console.log('Greater then '+(this.cv==1?1:2));

y en tu caso,

console.log('Greater than '+this.cv);

debería ser suficiente.

0
agregado

Use una declaración de cambio:

switch(this.cv)
{
case '1':
  console.log('Greater Than 1');
  break;
case '2':
  console.log('Greater Than 2');
  break;
default:
  //executed if no matches are found
}

O un mapa funcionaría bien también según la respuesta de adeneo, ya que es básicamente la forma en que se implementa una instrucción switch. Ambas son buenas opciones para comprimir varios if-statements.

0
agregado

Puede usar una instrucción switch, consulte este enlace para más detalles

Sintaxis general de SWITCH:

switch (expression) {
  case label1:
    statements1
    [break;]
  case label2:
    statements2
    [break;]
  ...
  case labelN:
    statementsN
    [break;]
  default:
    statements_def
    [break;]
}

En tu caso :

switch(this.cv) {
case '1':
    console.log("Greater than 1");
    break;
case '2':
    console.log("Greater than 2");
    break;
}
0
agregado
@ j08691 Si bien el código escrito puede no serlo, las operaciones ejecutadas ciertamente son;)
agregado el autor Niet the Dark Absol, fuente
Sin embargo, tengo que rechazar esta respuesta porque lo complicó demasiado. [break;] ... mientras entiendo que significa "opcional break; ", otros no.
agregado el autor Niet the Dark Absol, fuente
Esto no sería significativamente más corto que una serie de declaraciones if.
agregado el autor j08691, fuente
Bueno, deberías hablar con Mozilla porque acabo de copiar la sintaxis :) developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
agregado el autor Charaf JRA, fuente

Yo diría crear un objeto que mapee los valores posibles a los mensajes y simplemente recuperar el mensaje del mapa de la siguiente manera:

var messages = {'1': 'Greater Then 1',
                '2': 'Greater Than 2'};
console.log(messages[this.cv]);
0
agregado
Cuidado, estás tratando de indexar la matriz con un valor de carácter, no un número entero ...
agregado el autor Joel, fuente
Pueden ser ... ¡tu edición es quizás una mejor práctica!
agregado el autor Joel, fuente
las matrices están indexadas por cadenas, ¿cuál es el problema?
agregado el autor dandavis, fuente
Creo que en realidad funcionaría en la opción original, pero estoy de acuerdo en que lo que sugirió aclara lo que hace, especialmente porque lo está recuperando con un valor de cadena.
agregado el autor Bart Enkelaar, fuente
JavaScript - Comunidad española
JavaScript - Comunidad española
4 de los participantes

En este grupo hablamos de JavaScript. Partner: es.switch-case.com