2011-01-31 10 views
7

C'è un modo breve per scrivere quanto segue utilizzando JavaScript o jQuery?Codice più breve per questo JavaScript "if" statement

if (this.id==="a" || this.id==="b" || this.id==="c" || this.id==="d") 
+5

Ecco una pagina per confrontare le prestazioni dei vari suggerimenti di seguito riportati: http://jsperf.com/set-memberbship –

+0

@ Jason LeBrun ho un +1 per la bella demo - ma come [più-spesso-poi-non] sempre, * chiarezza prima *. Do la colpa alla mia CPU per la postazione FF lenta ;-) –

risposta

5
if (['a','b','c','d'].indexOf(this.id) >= 0) { ... } 

o

if (this.id in {'a':0,'b':0,'c':0,'d':0}) { ... } 
+2

Se 'this.id' è' 'a'', il primo esempio non lo saprebbe. – ClosureCowboy

+0

Whoops, grazie. Modificato. –

+0

Sia il tuo amswer @ limc (d in o) sono il modo più simile e veloce per scriverlo. Grazie per il link alle prestazioni che hai fornito. – Hussein

6

Che ne dici di questo?

if (this.id in { "a":1, "b":1, "c":1, "d":1 }) { 
    ... 
} 

... o questo?

if("abcd".indexOf(this.id) > -1) { 
    ... 
} 

+0

** + 1 ** Probabilmente non userei '1' come valore fittizio, però. – ClosureCowboy

+0

@ClosureCowboy: Grazie per il suggerimento ... Ho anche aggiunto un altro esempio, anche se non è davvero leggibile secondo me. :) – limc

+0

non vorrei combinare tutte le lettere come una parola. Questo non funzionerà se la variabile è più di 1 lettera, anche se è un bel modo per scriverlo. – Hussein

1

È possibile provare il seguente codice. Soprattutto quando hai più di quattro valori di test.

if (/^[abcdef]$/.test(this.id)) { 
    ... 
} 
+1

Che ne dici se la variabile è più di una lettera. – Hussein

+0

'if (/^(val1 | val2 | val3) $ /. Test (this.id)) {...}' –

+0

Aggiornato lo script di test per includere anche queste due idee. –

2

Una possibilità è un'istruzione switch.

switch(this.id){case"a":case"b":case"c":case"d": 
    //do something 
} 
+0

anche questo funziona, ma alla fine ripetiamo la parola caso 4 come nel mio esempio ripetendo la parola this.id 4 volte. – Hussein

+0

@alex: Sì, ma è un po 'più breve, quindi ho pensato di buttarlo lì. : o) – user113716

+0

+1 per quello .... – Hussein

0

L'hash anonimo in linea (d in o) performance è stata travisata nel tests as originally written, perché l'hash non è stato in linea nella prova.

Stranamente, il vero e proprio caso in linea di hash, rispetto al caso di hash predefinito, è molto più lento in Firefox 4, ma 50% più veloce in Chrome 12.

Ma un altro punto importante è che d in o manca il punto di un hash, che non devi iterare per trovare le cose.

due linee, ma ancora piuttosto breve, e by far the fastest:

var o = {a:1,b:1,c:1,d:1}; 
if(o[this.id]){...}