donc je veux utiliser une instruction switch comme celle-ci:
switch (scrollLeft) {
case (<1000):
//do stuff
break;
case (>1000 && <2000):
//do stuff
break;
}
Maintenant, je sais que ces déclarations ( <1000
) ou ( >1000 && <2000
) ne fonctionneront pas (pour différentes raisons, évidemment). Ce que je demande, c'est la manière la plus efficace de le faire. Je déteste utiliser 30 if
instructions, donc je préfère utiliser la syntaxe de commutateur. Puis-je faire quelque chose?
your_mapper_object[scrollLeft / SOME_CONST]
, en supposantyour_mapper_object
que cela ressemble à quelque chose{1: some_func, 2: another_func, ...}
. Et dans ce cas, vous pouvez également utiliser switch.Réponses:
Quand j'ai regardé les solutions dans les autres réponses, j'ai vu des choses que je sais néfastes pour les performances. J'allais les mettre dans un commentaire mais j'ai pensé qu'il valait mieux le comparer et partager les résultats. Vous pouvez le tester vous-même . Voici mes résultats (ymmv) normalisés après l'opération la plus rapide dans chaque navigateur (multipliez le temps 1.0 par la valeur normalisée pour obtenir le temps absolu en ms).
Testez où effectué sur Windows 7 32 bits avec les versions suivantes: Chrome 21.0.1180.89m , Firefox 15.0 , Opera 12.02 , MSIE 9.0.8112 , Safari 5.1.7 . Node a été exécuté sur une boîte Linux 64 bits car la résolution du minuteur sur Node.js pour Windows était de 10 ms au lieu de 1 ms.
si-immédiat
C'est le plus rapide dans tous les environnements testés, sauf dans ... drumroll MSIE! (surprise Surprise). Il s'agit de la méthode recommandée pour l'implémenter.
si-indirect
Il s'agit d'une variante de
switch-indirect-array
mais avec desif
instructions à la place et qui fonctionne beaucoup plus rapidement queswitch-indirect-array
dans presque tous les environnements testés.interrupteur immédiat
C'est assez rapide dans tous les environnements testés, et en fait le plus rapide dans MSIE. Cela fonctionne lorsque vous pouvez faire un calcul pour obtenir un index.
gamme de commutateurs
C'est environ 6 à 40 fois plus lent que le plus rapide dans tous les environnements testés, sauf pour Opera où cela prend environ une fois et demie plus de temps. C'est lent car le moteur doit comparer la valeur deux fois pour chaque cas. Étonnamment, cela prend presque 40 fois plus de temps à Chrome pour terminer cette opération que l'opération la plus rapide de Chrome, tandis que MSIE ne prend que 6 fois plus de temps. Mais le décalage horaire réel n'était que de 74 ms en faveur de MSIE à 1337 ms (!).
gamme de commutateurs2
Il s'agit d'une variante de
switch-range
mais avec une seule comparaison par cas et donc plus rapide, mais toujours très lente sauf dans Opera. L'ordre de la déclaration de cas est important car le moteur testera chaque cas dans l'ordre du code source ECMAScript262: 5 12.11switch-indirect-array
Dans cette variante, les plages sont stockées dans un tableau. C'est lent dans tous les environnements testés et très lent dans Chrome.
tableau-recherche linéaire
Il s'agit d'une combinaison d'une recherche linéaire de valeurs dans un tableau et de l'instruction switch avec des valeurs fixes. La raison pour laquelle vous voudrez peut-être l'utiliser est que les valeurs ne sont pas connues avant l'exécution. Il est lent dans tous les environnements testés et prend près de 10 fois plus de temps dans MSIE.
tableau-commutateur-binaire
Il s'agit d'une variante de
array-linear-switch
mais avec une recherche binaire. Malheureusement, elle est plus lente que la recherche linéaire. Je ne sais pas si c'est mon implémentation ou si la recherche linéaire est plus optimisée. Il se peut également que l'espace de clés soit trop petit.Conclusion
Si les performances sont importantes, utilisez
if
-statements ouswitch
avec des valeurs immédiates.la source
Une alternative:
Démo: http://jsfiddle.net/UWYzr/
la source
if(...) else if(...)
? Cela évite,if
mais ne ressemble pas vraiment à un joli remplacement pour moi.if
déclarations. Voir ma réponse iciFonctionne uniquement si vous avez des étapes régulières ...
EDIT: puisque cette solution ne cesse de recevoir des votes positifs, je dois vous conseiller que la solution de mofolo est bien meilleure
la source
Math.round(scrollLeft/1000)
d'ailleurs.Vous pouvez créer un objet personnalisé avec les critères et la fonction correspondant aux critères
Définissez les fonctions pour ce que vous voulez faire dans ces cas (définissez function1, function2 etc.)
Et "évaluer" les règles
Remarque
Plusieurs fois si les déclarations sont plus faciles à lire et à maintenir. Je recommanderais ce qui précède uniquement lorsque vous avez beaucoup de conditions et une possibilité de beaucoup de croissance à l'avenir.
Mise à jour
Comme @Brad l'a souligné dans les commentaires, si les conditions s'excluent mutuellement (une seule d'entre elles peut être vraie à la fois), la vérification de la limite supérieure devrait être suffisante:
à condition que les conditions soient définies par ordre croissant (d'abord la plus basse
0 to 1000
, puis1000 to 2000
par exemple)la source
action=function1
- ne devraient-ils pas être des deux points? ;-) - Vous pouvez également refactoriser cela pour n'avoir qu'une limite supérieure car, en raison du processus d'élimination, vous ne pouvez pas appartenir à deux groupes - sauf si c'était votre intention (d'avoir plusieurs actions possibles).Que faites-vous exactement
//do stuff
?Vous pourrez peut-être faire quelque chose comme:
la source
Non testé et incertain si cela fonctionnera, mais pourquoi ne pas en faire quelques-uns
if statements
avant, pour définir des variables pour leswitch statement
.la source
Ceci est une autre option:
la source
Mise à jour de la réponse acceptée (ne peut pas encore commenter). Depuis le 1/12/16 utilisant la démo jsfiddle en chrome, switch-immediate est la solution la plus rapide.
Résultats: Résolution temporelle: 1,33
Fini
la source
Dans mon cas (codage couleur d'un pourcentage, rien de critique pour les performances), j'ai rapidement écrit ceci:
la source
J'ai eu la même situation ces derniers temps, c'est comme ça que je l'ai résolu:
avant:
après:
Et si vous définissez "1, 2, 3, 4, 5", cela peut être encore plus simple:
la source