2015-06-22 15 views
9
if (Progress.bar.status == 'finished' || Progress.bar.status == 'uploading'){ 
    //code here 
} 

Come si accorcia questo? Mi piacerebbe scriverlo senza dover ripetere lo Progress.bar.status due volte.Collegamento per confrontare le istruzioni

Qualcosa sulla falsariga di:

Progress.bar.status == ('finished' or 'uploading'). 
+1

'Progress.bar.status? ('finito' || 'caricamento'): 'qualcos'altro'' –

+0

Quali sono gli altri valori possibili? –

+0

@SwarajGiri, questo non funziona, perché ogni stringa non vuota restituisce true e che forza ''finished'' per tornare. ma il requisito di // codice qui non è (non può essere) implementato. –

risposta

16

mi piace tabelle di ricerca:

if ({finished:1, uploading:1}[Progress.bar.status]){ 
    //code here 
} 

questo utilizza un oggetto di codice di due o più opzioni, e anche passi laterali citando ogni scelta. è anche molto veloce poiché l'oggetto può essere memorizzato nella cache e non vi è alcuna logica di confronto o metodi da richiamare, solo un accesso veloce alla proprietà che guida il flusso ...

notare che in alcuni casi, è possibile utilizzare Object.create(null) e quindi unire/estendere tale oggetto vuoto con le opzioni, se è assolutamente necessario evitare i falsi positivi per "hasOwnProperty", "valueOf", "toString", "toLocaleString", "costruttore" e alcune estensioni double-underscore. spesso non è un problema, ma è qualcosa da tenere a mente. se puoi vivere senza alimentare le tue parole chiave if o creare una raccolta di scelte memorizzate nella cache da Object.create(), è un modo semplice e veloce per codificare "uno dei flussi sopra".

+0

Bello, non lo sapevo. – hsz

+0

Perché aggiungi _1_ in ** {terminato: 1, caricando: 1} **? –

+1

'1' è un valore che soddisferà il' if ('quando la chiave corrisponde, ed è veloce da digitare, qualsiasi valore di thruthy lo farà, ma per molti prog,' 1' significa sì e '0' significa no .. – dandavis

4

fanno con le corde voleva una matrice, applicare una ricerca per l'indice della matrice. Il risultato è -1 per non trovato e 0 ... n per una stringa trovata. per fare questa breve e mentre abbiamo bisogno solo la ... risultato 0 n, applicare un bit per bit non al risultato (https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_NOT) :

value ~value boolean 
-1 => 0 => false 
    0 => -1 => true 
    1 => -2 => true 
    2 => -3 => true 
    and so on 

Nel codice tutto insieme sembra che questo:

if (~['finished', 'uploading'].indexOf(Progress.bar.status)) { 
    // code here 
} 
+0

puoi spiegarlo anche – ozil

+0

@ozil, eccoci qua. –

4

posso suggerire a lavorare con le enumerazioni poi una dichiarazione switch():

var Status = { 
    Finished: 'finished', 
    Uploading: 'uploading' 
}; 

switch (Progress.bar.status) { 
    case Status.Finished: 
    case Status.Uploading: 
     //code here 
     break; 
} 

Più codice inizialmente, ma più flessibile e leggibile.

0

so, che l'estensione oggetto nativo è un tabù, ma:

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

if(Progress.bar.status.eqOr('finished', 'uploading')){ 
    //code here 
} 

v2.0, grazie Jack

String.prototype.eqOr = function(){ 
    return [].indexOf.call(arguments, this.toString()) !== -1; 
} 
+0

'return [] .indexOf.call (argomenti, questo)! == -1;' :) –

+0

o cuoce un take-away: 'isOk = []. IndexOf.bind (['finished', 'uploading']); ' – dandavis

Problemi correlati