2010-08-26 141 views
3

我有以下如果,否則if,else構造和我只是好奇我如何能夠將構造轉換爲switch語句。從if轉換到switch語句

var emailSubject = email.subject.toLowerCase(); 
if(emailSubject.indexOf("account request") >= 0){ 
    //do acct req 
}else if(emailSubject.indexOf("accounts pending removal for") >= 0){ 
    //do account removal 
}else if(emailSubject.indexOf("listserv application") >= 0){ 
    //do listserv app 
}else if(emailSubject.indexOf("student organization webmaster transfer request") >= 0){ 
    //do webmaster xfer 
}else{ 
    //do default 

} 

我的想法是,但我不認爲這是正確的:

switch(emailSubject){ 
    case this.indexOf("account request"): 
     //do acct request 
     break; 
    default: 
     //do default 
} 

或者

switch(0){ 
    case emailSubject.indexOf("accounts pending removal"): 
    //process account pending removal 
    break; 
    default: 
    //do default behavior 
} 
+0

你爲什麼不試試並調試一樣? – Kangkan 2010-08-26 14:02:44

回答

6

你的示例代碼不能很容易地轉換到一個switch語句中大多數語言,也不應該是。 switch用於比較單個變量與一定範圍的常量值,而您的邏輯需要與非常量值進行比較,而無需使用變量進行比較。 if/else if是您的案例正確的結構。

+0

我理解它的實用性方面,但它更像是我在編寫代碼時發生的令人深思的問題。乾杯。 – Chris 2010-08-26 14:06:48

+0

@Chris,你提出的'switch'語句在大多數語言中都是語法錯誤,包括AFAIK,javascript。這是因爲'case'語句的值必須是常量值,而不是運行時計算的結果。 – 2010-08-26 14:12:46

2

您只能使用情況檢查一個值:

switch(emailSubject){ 
    case "Subject1": //(emailSubject == "Subject1") 
     //do acct request 
     break; 
    case "Subject2": //(emailSubject == "Subject2") 
     //do something else 
     break; 
    default: 
     //do default 
} 

否則,你應該使用的if/else

0

如前所述,if/else語句是最適合你的本事。

但是,如果你正在尋找的,而不是內主題行字實際整個主題行,你可以這樣做:

var a = ["account request", "listserv application", "student organization webmaster transfer request"]; 
switch(a.indexOf(emailSubject)) { 
    // ... 
} 
+0

主題是動態的,但條件檢查是給定主題行的常見文本。通常包含一個用戶名或者可能是一個引用另一個系統的某個標識符。 – Chris 2010-08-26 14:29:54

+0

在執行上述操作之前,您可以將相對常量的內容像用戶名和ID標記出來(即將用戶名替換爲'%u'或其他內容)。 – sje397 2010-08-26 14:36:48

+0

似乎比它的價值更麻煩,因爲這僅僅是一個好奇心問題。 – Chris 2010-08-26 14:38:55

2

構建這樣通常大聲疾呼多態性...

玩在這裏:http://jsbin.com/utilu4/3

var mailHandlers = [ 

    { 
    CanHandleEmail : function(email) { 
     return email.subject.toLowerCase().indexOf("account request") >= 0; 
    }, 

    HandleEmail : function(email) { 
     alert("do acct req"); 
    } 
    }, 

    { 
    CanHandleEmail : function(email) { 
     return email.subject.toLowerCase().indexOf("account pending removal for") >= 0; 
    }, 

    HandleEmail : function(email) { 
     alert("do account removal"); 
    } 
    }, 

    { 
    CanHandleEmail : function(email) { 
     return email.subject.toLowerCase().indexOf("listserv application") >= 0; 
    }, 

    HandleEmail : function(email) { 
     alert("do listserv app"); 
    } 
    }, 

    { 
    CanHandleEmail : function(email) { 
     return email.subject.toLowerCase().indexOf("student organization webmaster transfer request") >= 0; 
    }, 

    HandleEmail : function(email) { 
     alert("do webmaster xfer"); 
    } 
    }, 

    { 
    CanHandleEmail : function(email) { 
     return true; 
    }, 

    HandleEmail : function(email) { 
     alert("do default"); 
    } 
    } 
]; 

function HandleEmail(email) { 
    for(i=0; i< mailHandlers.length; i++) { 
    if(mailHandlers[i].CanHandleEmail(email)){ 
     mailHandlers[i].HandleEmail(email); 
     break; 
    } 
    } 
}; 
+0

這很有趣。很有意思。雖然我不確定我可以在我編寫腳本的環境中執行此代碼。它位於一個需要並解析這個代碼服務器端的應用程序中,但我會試一試,無論我從中學到了什麼。謝謝你的回答。 – Chris 2010-08-26 14:30:39

+0

該代碼中有一些語法錯誤,我沒有測試過它。現在已經修復了。 – joshperry 2010-08-26 14:33:19

0

就像一個小竅門:在功能包裝你的代碼,並返回本場比賽的價值。 (在這種情況下,你不必使用else。)如果你願意,你可以返回一個匹配的代碼(例如一個int)並使用switch/case來執行該操作。

+0

如果你願意的話,那隻會引入僞枚舉而使代碼複雜化。 – Chris 2010-08-26 14:38:27

0

我剛纔在野外遇到這個,我忍不住分享它,但不這樣做

var emailSubject = email.subject.toLowerCase(); 
switch (true) { 
    case (emailSubject.indexOf("account request") >= 0): 
     //do acct req 
     break; 
    case (emailSubject.indexOf("accounts pending removal for") >= 0): 
     //do account removal 
     break; 
    case (emailSubject.indexOf("listserv application") >= 0): 
     //do listserv app 
     break; 
    case (emailSubject.indexOf("student organization webmaster transfer request") >= 0): 
     //do webmaster xfer 
     break; 
    default: 
     //do default 
     break; 
}