2010-05-28 11 views
8

C'è un modo migliore per scrivere il seguente condizionale in javascript?mano corta per concatenare operatori logici in javascript?

if (value == 1 || value == 16 || value == -500 || value == 42.42 || value == 'something') { 
    // blah blah blah 
} 

Odio avere tutti questi OR logici uniti. Mi chiedo se ci sia una sorta di stenografia.

Grazie!

risposta

5
var a = [1, 16, -500, 42.42, 'something']; 
var value = 42; 
if (a.indexOf(value) > -1){ 
// blah blah blah 
} 

Aggiornamento: Esempio di funzione di utilità come proposto nei commenti:

Object.prototype.in = function(){ 
    for(var i = 0; i < arguments.length; i++){ 
    if (this == arguments[i]) return true; 
    } 
    return false; 
} 

Così si può scrivere:

if (value.in(1, 16, -500, 42.42, 'something')){ 
// blah blah blah 
} 
+8

Basta essere consapevoli del fatto che 'Array.prototype.Il metodo indexOf' non è disponibile su IE. – CMS

+1

@CMS Grazie per un prezioso avviso. Tuttavia, può essere risolto in una sola volta. http://stackoverflow.com/questions/1744310/how-to-fix-array-indexof-in-javascript-for-ie-browsers – Li0liQ

+0

Questo potrebbe rendere una buona funzione di utilità per evitare di rendere l'istruzione if ancora più complessa di originale. Basta inserire una serie di valori e voilà hai una sintassi abbreviata. – JohnFx

2

no, è la stenografia.

in alternativa, si può fare un switch

switch (value) { 
case 1 : 
case 16 : 
case -500 : 
    .... 
} 

che è più facile da gestire se avete bisogno di un sacco di possibili valori, ma in realtà la versione è più breve comunque :)

+0

Se è misto, è possibile eseguire il cast di un valore su una stringa e eseguire il confronto tra stringhe. Più lento ma possibile. Penso anche che questa opzione sia più ... leggibile rispetto all'opzione 'indexOf' presentata. –

+0

oh hai ragione, ho pensato che fosse java non javascript :) – oedo

4

Si potrebbe estendere l'oggetto array:

Array.prototype.contains = function(obj) { 
    var i = this.length; 
    while (i--) { 
    if (this[i] == obj) { 
     return true; 
    } 
    } 
    return false; 
} 

Poi, se si memorizzano tutti quei valori in una matrice si potrebbe fare qualcosa di simile MyValues.contains (valore)

+0

Se la coercizione di tipo non è prevista, ti consiglio di usare '===' invece '==', tuttavia IMO, con questo approccio, la cosa migliore è usare lo standard [ Metodo 'Array.prototype.indexOf'] (https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Array/IndexOf), come [@ Li0liQ] (http://stackoverflow.com/questions/2932131/short-hand-for-chaining-logico-operatori-in-javascript/2932166 # 2932166) cita, è disponibile * in modo nativo * su tutti i browser tranne IE. – CMS

+0

Non sono javascript pro - buono a sapersi. Grazie – Prescott

0

interruttore è una scelta accettabile. Puoi anche utilizzare una mappa, a seconda della complessità del problema (supponendo che tu abbia più di quello che hai inserito nell'esempio).

var accept = { 1: true, 16: true, '-500': true, 42.42: true, something: true }; 
if (accept[value]) { 
    // blah blah blah 
} 

accetta potrebbe essere generato progressivamente da un array di corso. Dipende davvero da quanto pensi di usare questo modello. :/

0

Beh, si potrebbe utilizzare un'istruzione switch ...

switch (value) { 
    case 1 : // blah 
       break; 
    case 16 : // blah 
       break; 
    case -500 : // blah 
       break; 
    case 42.42: // blah 
       break; 
    case "something" : // blah 
        break; 
} 

Se stai usando JavaScript 1.6 o superiore, è possibile utilizzare la notazione indexOf su un array:

if ([1, 16, -500, 42.42, "something"].indexOf(value) !== -1) { 
    // blah 
} 

E per il massimo in hackiness, è possibile costringere i valori in stringhe (questo funziona per tutti i browser):

if ("1,16,-500,42.42,something".indexOf(value) !== -1) { 
    // blah 
} 
1
var value= -55; 
switch(value){ 
    case 1: case 16: case -55: case 42.5: case 'something': 
     alert(value); break;   

} 
0

Nel tentativo di fare ancora un altro modo di farlo ...

if (/^(1|16|-500|42.42|something)$/.test(value)) { 
    // blah blah blah 
} 

Non c'è bisogno di estendere prototipi array o qualsiasi cosa, basta usare un rapido regexp per verificare il valore!

Problemi correlati