我有以下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
}
答案 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;
}