代码之家  ›  专栏  ›  技术社区  ›  Chris

从if else转换为switch语句

  •  3
  • Chris  · 技术社区  · 14 年前

    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 
    }
    
    6 回复  |  直到 14 年前
        1
  •  6
  •   JSBÕ±Õ¸Õ£Õ¹    14 年前

    在大多数语言中,您的示例代码不能轻松地转换为switch语句,也不应该转换为switch语句。 switch if / else if 是你案子的正确结构。

        2
  •  2
  •   fredley    14 年前

    只能使用case检查值:

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

    否则应该使用if/else

        3
  •  2
  •   joshperry    14 年前

    像这样的构造通常需要多态性。。。

    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;
        }
      }
    };
    
        4
  •  0
  •   sje397    14 年前

    如前所述,if/else最适合你所拥有的。

    但是,如果您要查找实际的整个主题行,而不是主题行中的单词,则可以执行以下操作:

    var a = ["account request", "listserv application", "student organization webmaster transfer request"];
    switch(a.indexOf(emailSubject)) {
      // ...
    }
    
        5
  •  0
  •   fb55    14 年前

        6
  •  0
  •   Rawling isekaijin    9 年前

    我刚在野外遇到这个,我忍不住要分享,但是 别这么做 .

    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;
    }