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

如何縮短這個?我想編寫它而不必重複Progress.bar.status兩次。快捷方式比較語句

線沿線的東西:

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

'Progress.bar.status? ('完成'||'上傳'):'別的東西' –

+0

其他可能的值是什麼? –

+0

@SwarajGiri,這不起作用,因爲任何非空字符串返回true,並強制''完成''返回。但是'//代碼在這裏'的要求不是(不能)實現的。 –

回答

16

我喜歡查找表:

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

此使用對象代碼的兩個或更多的選擇,甚至側面步驟引用的每一個選擇。它也非常快,因爲對象可以緩存並沒有比較的邏輯或方法來調用,只需快速屬性訪問驅動流...

做注意到,在某些情況下,你可能需要使用Object.create(null)然後如果您絕對必須避免「hasOwnProperty」,「valueOf」,「toString」,「toLocaleString」,「構造函數」和一些雙下劃線擴展的誤報,可以合併/擴展該空白對象與選項。這通常不是一個問題,但需要牢記。如果您可以在不添加if這些關鍵字的情況下生活,或者從Object.create()構建緩存的選擇集合,那麼這是一種編碼「上述之一」流程的快速而簡單的方法。

+0

不錯,不知道。 – hsz

+0

爲什麼在** {{finished:1,上傳:1} **)中添加_1_? –

+1

'1'是一個值,它將滿足'if('當鍵匹配並且鍵入快時,任何thruthy值都會做,但是對於很多progs,'1'表示是,'0'表示不。 – dandavis

4

請與想要的字符串數組,申請數組的索引的搜索。結果是-1未找到,0..n找到的字符串。使這個短,而我們只需要0 ... N結果,應用按位不結果(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 

在代碼一起,它看起來是這樣的:

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

你能解釋一下嗎? – ozil

+0

@ ozil,我們走吧。 –

4

我可以建議用枚舉的那麼switch()聲明:最初

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

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

更多的代碼,但更靈活和可讀性。

0

我知道,擴展原生對象是一個禁忌,但:

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,感謝傑克

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

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

+0

or bake a take-away:'isOk = []。indexOf.bind(['finished','uploading']] );' – dandavis