2010-11-02 8 views
29

¿Hay alguna manera de escribir una instrucción de cambio condicional en javascript?Sentencia de cambio condicional de Javascript

No estoy adivinando, ya que el siguiente siempre va a por defecto:

var raw_value = 11.0; 
    switch(raw_value) 
    { 
     case (raw_value > 10.0): 
      height = 48; 
      width = 36; 
      break; 
     case (raw_value > 5.0): 
      height = 40; 
      width = 30; 
      break; 
     default: 
      height = 16; 
      width = 12; 
      break; 
    } 

Si no es así, ¿qué debo usar en su lugar - una larga sentencia if/else?

gracias :)

+0

Una buena solución sería una matriz, y una versión de JavaScript de esta [pregunta PHP reciente] (http://stackoverflow.com/questions/4032753/picking-the-nearest-value-from-an-array-reflecting-ranges) .... pero eso no va a ser trivial a port. –

+0

No es TAN largo de una instrucción if - else (if, else if, else). Bastante estándar (y menos sangría). –

+0

If/else ocupa menos espacio, es más fácil de leer, menos de escribir y menos propenso a errores autoinfligidos. – BGerrissen

Respuesta

23

En un switch statement, el valor evaluado de la expresión switch se comparan los valores de la evaluadas de los casos. Entonces aquí el valor de raw_value (número) se compara con raw_value > 10.0 (expresión de comparación) y raw_value > 5.0 (expresión de comparación).

Así que a menos que una de sus expresiones case dió un número igual a 11.0 o utilice la expresión switchtrue, Usted siempre obtendrá el caso por defecto.

sólo tiene que utilizar un simple if/else lugar:

var raw_value = 11.0; 
if (raw_value > 10.0) { 
    height = 48; 
    width = 36; 
} else if (raw_value > 5.0) { 
    height = 40; 
    width = 30; 
} else { 
    height = 16; 
    width = 12; 
} 
+1

Y sin la necesidad de 'break', es tan limpio como el original. –

1

No, la declaración switch no funciona utiliza el estilo. Sin embargo, esta afirmación no siempre es más simple. Por ejemplo, la versión switch tarda 15 líneas:

var raw_value = 11.0; 
switch(raw_value) { 
    case (raw_value > 10.0): 
     height = 48; 
     width = 36; 
     break; 
    case (raw_value > 5.0): 
     height = 40; 
     width = 30; 
     break; 
    default: 
     height = 16; 
     width = 12; 
     break; 
} 

y la if/else versión "larga" única 11:

var raw_value = 11.0; 
if (raw_value > 10.0) { 
     height = 48; 
     width = 36; 
} else if (raw_value > 5.0) { 
     height = 40; 
     width = 30; 
} else { 
     height = 16; 
     width = 12; 
} 

Así, en su caso, es mejor usar el segundo de la primera ...

+0

Menos líneas de código no son objetivamente "mejores", ya que "buen código" es subjetivo. La legibilidad y la facilidad de comprensión son otros dos factores.Quizás agregue que este enfoque es mejor "si el objetivo es usar el menor número posible de líneas de código" – GrayedFox

88

De esta manera:

var raw_value = 11.0; 
switch(true) { 
    case (raw_value > 10.0): 
     height = 48; 
     width = 36; 
     break; 
    case (raw_value > 5.0): 
     height = 40; 
     width = 30; 
     break; 
    default: 
     height = 16; 
     width = 12; 
} 

Las expresiones en las declaraciones case se evaluarán en true o false, y si eso coincide con la condición switch ... voilà. El default actúa como un else.

Bonificación: puede invertir toda la lógica simplemente reemplazando true con false. Con las declaraciones if ... else if, debería editar cada cláusula if de forma individual.

+3

Esta debería ser la respuesta correcta, ya que hace lo que el OP preguntó en el estilo solicitado. Sin embargo, tuve un momento difícil la primera vez que vi una declaración de cambio (verdadero). –

+0

Me alegro de haber ayudado al menos a una persona. :) – DanMan

+1

Votó arriba y debe marcarse como la respuesta. La mayoría de los programadores (o tal vez solo yo) con el lenguaje de servidor exp. encontrar la implementación de JS no intuitiva. ¡Es raro comenzar la expresión evaluada y trabajar al revés! –

0

no intente esto en casa, o lo toman en serio, esto es sólo por diversión ...

function conditionalSwitch(value, cond, callback /* cond, callback, cond, callback, ... */) 
{ 
    for (var i = 1; i < arguments.length; i += 2) { 
    if (arguments[i](value)) { 
     arguments[i+1](value); 
     return; 
    } 
    } 
} 

var width, height; 

conditionalSwitch(5.1, 

    function(val) { return val > 10 }, 
    function() { 
    height = 48; 
    width = 36 
    }, 

    function(val) { return val > 5 }, 
    function() { 
    height = 40; 
    width = 30 
    }, 

    //Default 

    function(val) { return true }, 
    function() { 
    height = 16; 
    width = 12; 
    } 
) 

console.log(width, height); 
+0

Con este tipo de cosas, se trata principalmente de azúcar sintáctico ... – Lodewijk

+1

Erm, ¿no debería ser esto en un codepen o algo así, un lugar divertido? No veo el punto de que esté aquí ... –

Cuestiones relacionadas