2010-08-26 9 views
3

J'ai le suivant if, else if, else construire et je suis juste curieux de savoir comment je pourrais convertir tel que construct en une instruction switch.convertir à partir d'if else pour changer l'instruction

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 

} 

Mes pensées sont mais je ne pense pas que ce soit correct:

switch(emailSubject){ 
    case this.indexOf("account request"): 
     //do acct request 
     break; 
    default: 
     //do default 
} 

Ou

switch(0){ 
    case emailSubject.indexOf("accounts pending removal"): 
    //process account pending removal 
    break; 
    default: 
    //do default behavior 
} 
+0

Pourquoi ne pas essayer et déboguer le même? – Kangkan

Répondre

6

Votre code exemple ne peut pas facilement être converti en une instruction switch dans la plupart des langues, ni devrait-il. switch est pour comparer une seule variable contre une gamme de valeurs constantes, tandis que votre logique nécessite une comparaison avec des valeurs non constantes, sans aucune variable pour les comparer. if/else if est la construction correcte pour votre cas.

+0

Je comprends l'aspect pratique de celui-ci, mais c'était plus d'une question de réflexion que j'avais en écrivant du code. À votre santé. – Chris

+0

@Chris, votre proposition 'switch' proposée est une erreur de syntaxe dans la plupart des langues, y compris, AFAIK, javascript. En effet, les valeurs des instructions 'case' doivent être des valeurs constantes et non le résultat de calculs d'exécution. –

2

Vous ne pouvez utiliser le cas pour vérifier une valeur:

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

Sinon, vous devriez utiliser if/else

0

Comme mentionné précédemment, if/else est le mieux pour ce que vous avez.

Cependant, si vous recherchez des lignes entières de sujets réels, au lieu des mots dans les lignes de sujet, vous pouvez faire quelque chose comme:

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

Les sujets sont dynamiques mais le contrôle conditionnel est le texte courant pour une ligne d'objet donnée. Généralement, un nom d'utilisateur est également contenu ou potentiellement un identifiant d'identification d'un autre système. – Chris

+0

Vous pouvez masquer des éléments relativement constants tels que les noms d'utilisateur et les identifiants (c'est-à-dire remplacer le nom d'utilisateur par «% u» ou quelque chose d'autre) avant de procéder comme indiqué ci-dessus. – sje397

+0

semble être plus difficile que sa valeur, car il s'agit simplement d'une question de curiosité. – Chris

2

Constructs comme celui-ci sont généralement criant pour le polymorphisme ...

Jouez avec ici: 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

C'est intéressant. Très intéressant. Bien que je ne suis pas sûr que je peux exécuter ce code dans l'environnement où je suis scripté. C'est dans une application qui prend et analyse ce côté serveur de code, mais je vais essayer et peu importe ce que j'ai appris quelque chose. Merci pour votre réponse – Chris

+0

Il y avait quelques erreurs de syntaxe dans ce code, je ne l'avais pas testé. C'est corrigé maintenant. – joshperry

0

Tout comme un conseil: envelopper votre code dans une fonction et retourner la valeur du match. (Vous n'avez pas besoin d'utiliser autre chose dans ce cas.) Si vous le souhaitez, vous pouvez renvoyer un code pour la correspondance (par exemple un int) et utiliser switch/case pour effectuer l'action.

+0

Cela ne fait que compliquer le code en introduisant une pseudo-énumération si vous voulez. – Chris

0

Je viens de rencontrer cela dans la nature et je ne peux pas m'empêcher de le partager, mais ne le fais pas.

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