2010-08-26 5 views
3

У меня есть следующее if, else if, else construct и мне просто интересно, как я мог бы преобразовать такую ​​конструкцию в оператор switch.convert from if else to switch statement

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

ответ

6

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

+0

Я понимаю его практичность, но это был вопрос размышления, который я имел при написании кода. Приветствия. – Chris

+0

@Chris, ваш предлагаемый оператор 'switch' является синтаксической ошибкой на большинстве языков, включая AFAIK, javascript. Это потому, что значения для операторов 'case' должны быть постоянными значениями, а не результатом вычислений времени исполнения. –

2

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

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

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

0

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

Если, однако, вы искали фактические целые сюжетные линии, вместо слов в пределах сюжетных линий, вы могли бы сделать что-то вроде:

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

Темы являются динамическими, но условная проверка является общим текстом для данной темы. Обычно также содержится имя пользователя или потенциально идентификатор, ссылающийся на что-то другое. – Chris

+0

Вы можете замаскировать относительно постоянные вещи, такие как имена пользователей и идентификаторы (т. Е. Заменить имя пользователя на «% u» или что-то еще), прежде чем делать это. – sje397

+0

кажется больше неприятностей, чем его ценность, поскольку это всего лишь любопытство. – Chris

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

+0

В этом коде были ошибки синтаксиса, я не тестировал его. Теперь это исправлено. – joshperry

0

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

+0

Это просто усложняет код, вводя псевдоперечисление, если хотите. – Chris

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