从if else转换为switch语句

时间:2010-08-26 13:59:39

标签: javascript if-statement switch-statement

我有以下if,否则if,else构造,我只是好奇我如何将构造转换成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 
}

6 个答案:

答案 0 :(得分:6)

您的示例代码在大多数语言中都不能轻易转换为switch语句,也不应该。 switch用于将单个变量与一系列常量值进行比较,而您的逻辑需要与非常量值进行比较,没有变量可与之进行比较。 if / else if是您案例的正确结构。

答案 1 :(得分:2)

您只能使用大小写来检查值:

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

否则你应该使用if / else

答案 2 :(得分: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;
    }
  }
};

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

就像一个提示:将代码包装在一个函数中并返回匹配的值。 (在这种情况下,您不必使用else。)如果您愿意,可以返回匹配的代码(例如,int)并使用switch / case来执行操作。

答案 5 :(得分: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;
}