2010-06-21 18 views
5

ho condizionali come questo:condizionali più brevi in ​​js

if (foo == 'fgfg' || foo == 'asdf' || foo == 'adsfasdf') { 
// do stuff 

} 

Sicuramente c'è un modo più veloce per scrivere questo?

Grazie.

+1

No ... non proprio ... Se fosse foo == null || foo == undefined || foo == 0 potrebbe essere abbreviato in if (! foo) ... ma se stai confrontando foo contro 3 stringhe, allora hai bisogno di 3 diversi confronti. Assolutamente no. – Zoidberg

+1

Il tuo secondo può essere abbreviato in "if (true)", non può essere fgfg e asdf allo stesso tempo :) –

+0

Whoops lol, cosa stavo facendo, non importa su quel secondo. – Mark

risposta

4

Vorrei mantenere i condizionali come sono. Qualsiasi modo intelligente di accorciarli renderebbe il codice meno idiomatico e meno leggibile.

Ora, se si fa cura di leggibilità, è possibile definire una funzione per fare il confronto:

if(foo_satisfies_condition(foo)) { 
    // ... 
} 

Oppure:

if(is_month_name(foo) { 
    // ... 
} 

Se si dà la funzione di un nome che descrive fedelmente ciò lo fa, sarà più facile capire l'intento del codice.

L'implementazione di tale funzione dipende dal numero di confronti necessari. Se hai un numero molto elevato di stringhe a cui stai confrontando, potresti usare un hash. Tuttavia, i dettagli di implementazione sono irrilevanti durante la lettura del codice chiamante.

4
if (/^(fgfg|asdf|adsfasdf)$/.test(foo)) { 

o:

if (["fgfg", "asdf", "adsfasdf"].indexOf(foo) != -1) { 

supporto cross-browser Array.indexOf è ancora limitata. Inoltre, questi sono più veloci da scrivere, probabilmente non più veloci da eseguire.

+0

La prima riga restituisce true per una stringa che contiene solo una di quelle parole. "asdfz" innescherebbe il condizionale, per esempio. – erjiang

+0

@mazin, sì, in realtà ho aggiunto l'ancora mancante prima di vedere il tuo commento. –

+0

+1 per 'indexOf', -1 per usare regexp. : P I kid, I kid, +1 da me. –

0

A seconda della situazione che si possa fare ..

 
//At some point in your code 
var vals = new Array('fgfg', 'asdf', 'adsfasdf'); 
//... 
if(vals.indexOf(foo) >= 0) 
+0

Matthew Flaschen è meglio. – Anthony

+0

Dovresti guardarlo anche in termini di prestazioni, quando l'elenco delle opzioni cresce, le prestazioni delle espressioni regolari vanno a scapito, '.indexOf()' rimane un costo molto basso, se istanziate l'array una volta che è ovviamente meglio. –

+0

@Nick - Ovviamente, "costo molto basso" è un termine relativo. – ChaosPandion

6

si potrebbe considerare uno switch-case dichiarazione

switch(foo) { 
    case "fgfg": 
    case "asdf": 
    case "adsfasdf": 
    // ... 
} 

Non è proprio alcuna più breve, ma potrebbe essere più leggibile a seconda di quanti condizioni che usi.

4

Non c'è bisogno di utilizzare indexOf o una regex se si utilizza una tabella di hash:

var things = { 'fgfg' : 1, 'asdf' : 1, 'asdfasdf' : 1 }; 
if (things[foo]) { 
    ... 
} 
+0

Penso che questo si comporterebbe abbastanza bene. – ChaosPandion

+0

Onestamente, penso che questo sia meno leggibile rispetto alla semplice scrittura di condizionali, e non penserei che sarebbe più veloce scrivere. –

+1

Se pensi che sia meno leggibile, sicuramente non vorrei essere incaricato di lavorare sul tuo codice. :) Niente mi infastidisce più del vedere un condizionale estremamente complesso incollato insieme a una dozzina di operatori booleani quando una tabella di ricerca renderebbe le cose molto più semplici. – friedo

1

Ecco un modo semplice:

String.prototype.testList = function(lst) { 
lst = lst.split('|'); 
for(var i=0; i<lst.length; i++){ 
    if (this == lst[i]) return true; 
} 
return false; 
}; 

Per utilizzare questa funzione, è possibile solo fare questo:

if (foo.testList('fgfg|asdf|adsfasdf')) { 

si può anche rinominare testList per quello che vuoi, e cambiare il del imiter da | a tutto ciò che vuoi.

+0

Vorrei invertire il senso del test, ad esempio: String.prototype.hasToken = function (token) {return this.split (/ \ s + /). IndexOf (token)! = -1; }. –

0

Ternary operator sembra buono se vi piace e ha altro

+0

questo è quello che stavo cercando! è così che si chiama! –