2013-09-16 3 views
1

J'ai écrit un petit chèque pour un champ de saisie qui compte la longueur et s'assure que c'est la bonne quantité. Il devient complexe car il doit autoriser 9 chiffres ou 1 lettre et 5 chiffres. La façon dont je l'ai maintenant fonctionne mais le code me fait mal au cerveau, je voudrais voir à quoi ressemblerait une solution plus élégante, peut-être en utilisant ternary et/ou switch?Manière plus efficace d'écrire ceci si/sinon

Ainsi, une petite partie de la pas si jolie que j'ai en place maintenant:

if (len !== 9) { 
    if (len == 1) { 
     y.hide(); 
     n.show(); 
     valInput.text("You need 8 more numbers"); 
    } else { 
     if (len == 2) { 
      y.hide(); 
      n.show(); 
      valInput.text("You need 7 more numbers"); 
     } else { 
      if (len == 3) { 
       y.hide(); 
       n.show(); 
       valInput.text("You need 6 more numbers"); 
      } else { 
       if (len == 4) { 
        y.hide(); 
        n.show(); 
        valInput.text("You need 5 more numbers"); 
       } else { 
        if (len == 5) { 
         y.hide(); 
         n.show(); 
         valInput.text("You need 4 more numbers"); 
        } else { 
         if (len == 6) { 
          y.hide(); 
          n.show(); 
          valInput.text("You need 3 more numbers"); 
         } else { 
          if (len == 7) { 
           y.hide(); 
           n.show(); 
           valInput.text("You need 2 more numbers"); 
          } else { 
           if (len == 8) { 
            y.hide(); 
            n.show(); 
            valInput.text("You need 1 more number"); 
           } else { 
            if (len > 9) { 
             y.hide(); 
             n.show(); 
             valInput.text("Order number must be 9 digits"); 
             // gt 9 
            } 
            // 8 
           } 
           // 7 
          } 
          // 6 
         } 
         // 5 
        } 
        // 4 
       } 
       // 3 
      } 
      // 2 
     } 
     // 1 
    } 
    // this is not equal to 9 
} 

MISE À JOUR

Merci pour toutes les réponses! Beaucoup de bonnes choses, je vais accepter mon favori après avoir joué pendant un moment. Pour clarifier ce qui se passe lorsque les conditions requises sont remplies, le bouton "Soumettre" apparaît, mais pas avant qu'il ne soit validé. Je ne sais pas si elle est pertinente mais mentionne que la fonction fonctionne aussi comme « type en direct » de sorte que le message avec le compte est retourné après chaque .keyup()

+4

essayez d'utiliser 'switch'. Btw, vous pouvez les fusionner en un seul si ... else ...: if (len <9) { y.hide(); n.show(); ValInput.text ("Vous avez besoin" + (9 - len) + "plus de nombres") } – zsong

+1

Exemple de manuel sur l'utilisation de 'switch': D – tymeJV

+2

Pour sûr utiliser' switch', mais même sans cela, pourquoi est-ce une telle monstruosité? Il y a aussi un 'else if' ... – Jon

Répondre

5

Si vous ne « t veulent utiliser l'interrupteur, vous pouvez faire quelque chose comme ceci:

if (len < 9) { 
    y.hide(); 
    n.show(); 
    valInput.text("You need " + (9 - len) + " more number(s)"); 
} 
else if (len > 9) { 
    y.hide(); 
    n.show(); 
    valInput.text("Order number must be 9 digits"); 
} 
else { 
    // all good here... 
} 

et si vous ne voulez pas la partie "number(s)", il suffit de vérifier si len est pas 1, et d'ajouter que "s" à la "number".

+0

+1, j'utiliserais 'if (len && len <9)' pour m'assurer que c'est un nombre différent de zéro. –

+0

@SheikhHeera D'accord, mais 0 <9 et nous supposons que 'len' est un entier propre dérivé du nombre d'éléments. – Shomz

+0

@Shomz pourquoi avoir le 'else' alors? – progrenhard

3

Dans votre cas particulier il semble que la validation est assez simple pour quelque chose comme ceci:

function validate(len) { 
    var msg; 
    if (len == 9) 
     return true; 
    y.hide(); /* no need to duplicate these calls in each condition */ 
    n.show(); 
    if (len < 9) 
     msg = 'You need ' + (9-len) + ' more number' + (len == 1 ? '' : 's') + '.'; 
    else 
     msg = 'You entered ' + (len-9) + ' number' + (len == 1 ? '' : 's') + ' too many.; 
    valInput.text(msg); 
    return false; 

} 

Commentaire:=== devrait être conservé pour être en cas de besoin, non seulement pour être de fantaisie! Malheureusement, beaucoup sont enseignés pour éviter les doubles égaux plutôt que de comprendre réellement ses fonctionnalités supplémentaires utiles et utiles comme la conversion de type. Dans cette situation, il n'y a aucune raison d'utiliser triple égal.

Mais en général, comme si votre séquence de conditionals fait quelque chose de plus important que d'alerte une séquence de messages variables que par un nombre entier consécutif, puis utilisez switch ...

switch (len) { 
case 1: 

/* handle this case */; 
    y.hide(); 
    n.show(); 
    valInput.text("You need 8 more numbers"); 
    break; 
/* make sure to end case 1 with a break; */ 

case 2: 
    y.hide(); 
    n.show(); 
    valInput.text("You need 7 more numbers"); 
    break; 
/* make sure to end every case with a break; */ 

... 
} 
4

Comme ceux qui regardent tout de même pourquoi ne pas utiliser ceci:

if (len !== 9) { 
    var diff = 9 - len; 
    var value = (0 < diff ? "You need " + diff + " more numbers" : "Order number must be 9 digits"); 
    y.hide(); 
    n.show(); 
    valInput.text(value); 
} 
+1

+1, mais il y a aussi une partie «> 9». – Jon

+0

@Jon Bonne prise. J'ai mis à jour la réponse. – insertusernamehere

+0

'if (len! == 9) est vrai pour 0' et c'est pourquoi il vaut mieux utiliser' if (len && len <9) '. –

2

Vous pouvez simplifier à:

if (len !== 9) { 
     valInput.text("You need " + (9 -len) + " more numbers"); 
     y.hide(); 
     n.show(); 
    } 
2

Pourquoi même utiliser un switch ou un énorme if?

if(len == 9){ 
    // do stuff. 
}else{ 
    y.hide(); 
    n.show(); 
    if(9 > len) 
     valInput.text("You need " + (len - 9) + " less numbers"); 
    else 
     valInput.text("You need " + (9 - len) + " more numbers"); 
    valInput.text("Order number must be 9 digits"); 
} 

Juste la plage déclarer des valeurs que vous voulez alors concatenate la chaîne.

4

Je pense que vous devez calculer les caractères restants par javascript, puisque c'est la seule différence dans tous les autres, si des branches d'autre, de sorte que vous pouvez faire quelque chose comme ça et serait beaucoup plus facile à lire:

if (len !== 9) { 
    y.hide(); 
    n.show(); 
    if (len > 9) { 
     valInput.text("Order number must be 9 digits"); 
    } 
    else{ 
     var remaining = 9 - len; 
     valInput.text("You need " + remaining + " more numbers"); 
    } 
} 
+0

Tout va bien, sauf que je vais faire un pas de plus et me débarrasser de cette variable qui reste - ce n'est vraiment pas nécessaire. – Shomz

0

la alternative la plus courte:

(y.hide(), n.show(), valInput.text(
    len < 9 && "You need " + (9-len) + " more digits" 
    || len > 9 && "too many ("+ (len-9) + ") digits" 
    || "ok!" 
)); 
Questions connexes