2009-10-24 10 views
6

casos interruptor son por lo general comojquery Uso de rangos en cajas de interruptores?

Monday: 
Tuesday: 
Wednesday: 
etc. 

me gustaría utilizar rangos.

from 1-12: 
from 13-19: 
from 20-21: 
from 22-30: 

¿Es posible? Estoy usando javascript/jquery por cierto.

+0

posible duplicado de [¿Cómo puedo usar rangos en una declaración de mayúsculas y minúsculas usando JavaScript?] (Http://stackoverflow.com/questions/17145723/how-can-i-use-ranges-in-a-switch- case-statement-using-javascript) – Helen

Respuesta

14

usted podría intentar abusar de la caída del interruptor a través del comportamiento

var x = 5; 
switch (x) { 
    case 1: case 2: case 3: case 4: ... 
     break; 
    case 13: case 14: case 15: ... 
     break; 
    ... 
} 

que es muy prolijo

o usted podría probar este

function checkRange(x, n, m) { 
    if (x >= n && x <= m) { return x; } 
    else { return !x; } 
} 

var x = 5; 
switch (x) { 
    case checkRange(x, 1, 12): 
     //do something 
     break; 
    case checkRange(x, 13, 19): 
    ... 
} 

esto se consigue el comportamiento que te gustaría La razón por la que devuelvo !x en else de checkRange es para evitar el problema de cuando pasa undefined en la declaración de cambio. si su función devuelve undefined (como lo hace el ejemplo de jdk) y pasa undefined en el interruptor, entonces se ejecutará el primer caso. !x se garantiza que no es igual a x bajo ninguna prueba de igualdad, que es cómo la instrucción switch elige qué caso ejecutar.

0

No, es necesario utilizar un if/else if serie para hacer esto. JavaScript no es tan elegante (No muchos idiomas son.)

1

Puede hacer kludges interesantes. Por ejemplo, para probar un número contra un rango usando un interruptor de JavaScript, se puede escribir una función personalizada. Básicamente haga que la función pruebe dar un valor n y devolverlo si está dentro del rango. De lo contrario, devuelve indefinido o algún otro valor ficticio.

<script> 

// Custom Checking Function.. 
function inRangeInclusive(start, end, value) { 
    if (value <= end && value >= start) 
     return value; // return given value 
    return undefined; 
} 

// CODE TO TEST FUNCTION 
var num = 3; 
switch(num) { 
case undefined: 
    //do something with this 'special' value returned by the inRangeInclusive(..) fn 
    break; 
case inRangeInclusive(1, 10, num): 
    alert('in range'); 
    break; 
default: 
    alert('not in range'); 
    break; 
} 

</script> 

Esto funciona en Google Chrome. No probé otros navegadores.

+1

¿funciona si num no está definido? – barkmadley

+0

No funciona como se esperaba si num no está definido. –

+0

@barkmadley: Acabo de editar el código y agregué un caso para el valor indefinido para manejarlo explícitamente. Puede haber un mejor valor de retorno para usar en la función inRangeInclusive (..). Abierto a sugerencias. Gracias. –

7

tarde a la fiesta, sino en la búsqueda de una respuesta a la misma pregunta, me encontré con este hilo. Actualmente realmente uso un interruptor, pero de una manera diferente. Por ejemplo:

switch(true) { 
    case (x >= 1 && x <= 12): 
     //do some stuff 
     break; 
    case (x >= 13 && x <= 19): 
     //do some other stuff     
     break; 
    default: 
     //do default stuff 
     break; 
} 

Me parece mucho más fácil de leer que un montón de declaraciones IF.

+0

No puede hacerlo así en JavaScript, no evaluará las expresiones. – zuallauz

+0

No estoy seguro de lo que quiere decir, funciona bien en todos los casos de prueba que he lanzado. – stephennmcdonald