конвертировать из if if для переключения оператора - PullRequest
3 голосов
/ 26 августа 2010

У меня есть следующее if, else if, else construct, и мне просто любопытно, как я могу преобразовать такие, как construct, в оператор 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 ]

6 голосов
/ 26 августа 2010

Ваш пример кода не может быть легко преобразован в оператор switch в большинстве языков, равно как и не должен. switch - для сравнения одной переменной с диапазоном постоянных значений, тогда как ваша логика требует сравнения с непостоянными значениями, без переменной для сравнения. if / else if - правильная конструкция для вашего случая.

2 голосов
/ 26 августа 2010

Такие конструкции обычно требуют полиморфизма ...

Поиграйте с ним здесь: 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;
    }
  }
};
2 голосов
/ 26 августа 2010

Вы можете использовать регистр только для проверки значения:

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

В противном случае вы должны использовать if / else

0 голосов
/ 27 августа 2015

Я только что столкнулся с этим в дикой природе, и я не могу не поделиться этим, но не делайте этого .

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;
}
0 голосов
/ 26 августа 2010

В качестве подсказки: оберните ваш код в функцию и верните значение соответствия.(Вы не должны использовать другое в этом случае.) Если вы хотите, вы можете вернуть код для соответствия (например, int) и использовать переключатель / case для выполнения действия.

0 голосов
/ 26 августа 2010

Как уже упоминалось, если / else является лучшим для того, что у вас есть.

Если, однако, вы искали реальные целые строки темы, а не слова внутри строк темы, вы могли бы сделать что-то вроде:

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