2013-12-16 96 views
1

我想弄清楚如何簡化可能的長if else語句。如何縮短長if else語句

有8種可能性可以選擇,每個選項1-8我想顯示一條消息。

例如,這是什麼工作,但我知道可以更好writtern:

if(this.cv == '1'){ 
console.log('Greater Then 1'); 
} else 
if(this.cv == '2'){ 
console.log('Greater Than 2'); 
} 

等...

尋找的東西多一點活力。

+5

這個問題似乎是無關緊要的,因爲它是關於代碼審查 - ** http://codereview.stackexchange.com/.** – lifetimes

+1

如果您只需要一個一個查找,不需要切換,這比一個LUT慢:console.log({1:'gt one',2:'gt two'} [this.cv]) – dandavis

回答

6

使用地圖:

var messages = { 
    '1' : 'Greater than 1', 
    '2' : 'Greater than 2', 
    ....etc 
} 

console.log(messages[this.cv]); 
+0

我不能說更好自己,儘管我試過......爲什麼在一個開關中運行多個比較,而您可以運行一個名稱解析呢? – dandavis

+0

@dandavis在內部,這幾乎是'switch'所做的事情,但是用一個語句塊而不是一個字符串。 –

+0

開關評估每種情況,例如:switch(true),一個對象不會。如果有疑問的話。 – dandavis

1

您可以使用switch語句,檢查此鏈接for more details

Genaral開關的語法:

switch (expression) { 
    case label1: 
    statements1 
    [break;] 
    case label2: 
    statements2 
    [break;] 
    ... 
    case labelN: 
    statementsN 
    [break;] 
    default: 
    statements_def 
    [break;] 
} 

你的情況:

switch(this.cv) { 
case '1': 
    console.log("Greater than 1"); 
    break; 
case '2': 
    console.log("Greater than 2"); 
    break; 
} 
+1

這不會比一系列if語句短得多。 – j08691

+1

@ j08691雖然書面的代碼可能不是,但執行的操作當然是;) –

+0

但是我必須低估這個答案,因爲你已經過分複雜了。 '[break;]'...雖然我理解它的意思是「可選的」break;'「,其他人可能不會。 –

2

使用switch語句:

switch(this.cv) 
{ 
case '1': 
    console.log('Greater Than 1'); 
    break; 
case '2': 
    console.log('Greater Than 2'); 
    break; 
default: 
    //executed if no matches are found 
} 

或者根據adeneo的回答,一張地圖也可以很好地工作,因爲這基本上是一個switch語句的實現。兩種壓縮幾個if語句都是很好的選擇。

1

這就是switch聲明的原因。

switch(this.cv) { 
case '1': 
    console.log("Greater than 1"); 
    break; 
case '2': 
    console.log("Greater than 2"); 
    break; 
} 

你甚至可以添加一個「包羅萬象」默認動作:

default: 
    console.log("I don't know what to do with "+this.cv); 
1
switch(n) 
{ 
case '1': 
    execute code block 1 
    break; 
case '2': 
    execute code block 2 
    break; 
default: 
    code to be executed if n is different from case 1 and 2 
} 
3

如果這是你的消息的確切格式(適用於所有情況下),那麼你可以簡單的寫:

console.log('Greater Than ' + this.cv); 

不過,如果你需要更多的靈活性,每一種情況下,那麼你可以使用一個switch聲明爲其他答案有人建議。

1

我想說創建的可能值映射到消息的對象,並簡單地從地圖上像這樣檢索消息:

var messages = {'1': 'Greater Then 1', 
       '2': 'Greater Than 2'}; 
console.log(messages[this.cv]); 
+2

小心,你試圖用一個字符值索引數組,而不是一個整數... – Joel

+0

數組通過字符串索引,有什麼問題? – dandavis

+0

他們可以......你的編輯也許是更好的做法! – Joel

1

有時取決於我有很多功能添加到各種變量..

在這種情況下,我更喜歡使用類似的東西。 我用答案創建一個對象。然後我檢查答案是否存在並執行。 我更喜歡在開關

var a={'2':'greater than 2','1':'greater than 1'} 
console.log(a[this.cv]?a[this.cv]:'') 

另一種方式來寫,這是

var a={'2':'greater than 2','1':'greater than 1'} 
!a[this.cv]||(console.log(a[this.cv])); 

,或者如果你只是做一個簡短檢查使用JavaScript的簡寫。

console.log('Greater then '+(a=this.cv,a==1)?1:(a==2)?2:'whatever'); 

console.log('Greater then '+(this.cv==1?1:2)); 

,並在你的情況下,

console.log('Greater than '+this.cv); 

應該夠了。