Daher möchte ich eine switch-Anweisung wie die folgende verwenden:
switch (scrollLeft) {
case (<1000):
//do stuff
break;
case (>1000 && <2000):
//do stuff
break;
}
Jetzt weiß ich, dass eine dieser Anweisungen ( <1000
) oder ( >1000 && <2000
) nicht funktioniert (natürlich aus verschiedenen Gründen). Was ich frage, ist der effizienteste Weg, genau das zu tun. Ich hasse es, 30 if
Anweisungen zu verwenden, deshalb würde ich lieber die Switch-Syntax verwenden. Kann ich irgendetwas tun?
your_mapper_object[scrollLeft / SOME_CONST]
, vorausgesetzt, esyour_mapper_object
ist so etwas wie{1: some_func, 2: another_func, ...}
. In diesem Fall können Sie auch den Schalter verwenden.Antworten:
Als ich mir die Lösungen in den anderen Antworten ansah, sah ich einige Dinge, von denen ich weiß, dass sie schlecht für die Leistung sind. Ich wollte sie in einen Kommentar einfügen, aber ich dachte, es wäre besser, sie zu bewerten und die Ergebnisse zu teilen. Sie können es selbst testen . Unten sind meine Ergebnisse (ymmv) aufgeführt, die nach dem schnellsten Vorgang in jedem Browser normalisiert wurden (multiplizieren Sie die 1,0-Zeit mit dem normalisierten Wert, um die absolute Zeit in ms zu erhalten).
Der Test wurde unter Windows 7 32-Bit mit den folgenden Versionen durchgeführt: Chrome 21.0.1180.89m , Firefox 15.0 , Opera 12.02 , MSIE 9.0.8112 , Safari 5.1.7 . Node wurde auf einer Linux 64-Bit-Box ausgeführt, da die Timer-Auflösung unter Node.js für Windows 10 ms statt 1 ms betrug.
wenn sofort
Dies ist die schnellste in allen getesteten Umgebungen, außer in ... drumroll MSIE! (Überraschung Überraschung). Dies ist die empfohlene Methode zur Implementierung.
wenn-indirekt
Dies ist eine Variante von,
switch-indirect-array
aberif
stattdessen mit -statements und arbeitet viel schneller alsswitch-indirect-array
in fast allen getesteten Umgebungen.sofort wechseln
Dies ist in allen getesteten Umgebungen ziemlich schnell und in MSIE tatsächlich die schnellste. Es funktioniert, wenn Sie eine Berechnung durchführen können, um einen Index zu erhalten.
Schaltbereich
Dies ist in allen getesteten Umgebungen etwa 6 bis 40 Mal langsamer als die schnellste, mit Ausnahme von Opera, wo es etwa eineinhalb Mal so lange dauert. Es ist langsam, weil der Motor den Wert für jeden Fall zweimal vergleichen muss. Überraschenderweise dauert Chrome fast 40 Mal länger, um dies abzuschließen, verglichen mit dem schnellsten Vorgang in Chrome, während MSIE nur 6 Mal so lange dauert. Der tatsächliche Zeitunterschied betrug jedoch nur 74 ms zugunsten von MSIE bei 1337 ms (!).
Schaltbereich2
Dies ist eine Variante von
switch-range
aber mit nur einem Vergleich pro Fall und daher schneller, aber immer noch sehr langsam, außer in Opera. Die Reihenfolge der case-Anweisung ist wichtig, da die Engine jeden Fall in der Quellcode-Reihenfolge ECMAScript262: 5 12.11 testetSwitch-Indirect-Array
In dieser Variante werden die Bereiche in einem Array gespeichert. Dies ist in allen getesteten Umgebungen langsam und in Chrome sehr langsam.
Array-Linear-Suche
Dies ist eine Kombination aus einer linearen Suche nach Werten in einem Array und der switch-Anweisung mit festen Werten. Der Grund, warum man dies verwenden möchte, ist, wenn die Werte erst zur Laufzeit bekannt sind. Es ist in jeder getesteten Umgebung langsam und dauert in MSIE fast zehnmal so lange.
Array-Binärschalter
Dies ist eine Variante von,
array-linear-switch
aber mit einer binären Suche. Leider ist es langsamer als die lineare Suche. Ich weiß nicht, ob es sich um meine Implementierung handelt oder ob die lineare Suche optimierter ist. Es kann auch sein, dass der Schlüsselbereich zu klein ist.Fazit
Wenn die Leistung wichtig ist, verwenden Sie
if
-Statements oderswitch
mit unmittelbaren Werten.quelle
Eine Alternative:
Demo: http://jsfiddle.net/UWYzr/
quelle
if(...) else if(...)
? Das vermeidetif
, klingt aber für mich nicht nach einem hübschen Ersatz.if
-statements. Siehe meine Antwort hierFunktioniert nur, wenn Sie regelmäßige Schritte haben ...
EDIT: Da diese Lösung immer mehr Stimmen erhält, muss ich raten, dass die Lösung von mofolo viel besser ist
quelle
Math.round(scrollLeft/1000)
übrigens benutzt.Sie können ein benutzerdefiniertes Objekt mit den Kriterien und der Funktion erstellen, die den Kriterien entsprechen
Definieren Sie Funktionen für das, was Sie in diesen Fällen tun möchten (definieren Sie Funktion1, Funktion2 usw.).
Und "bewerte" die Regeln
Hinweis
Oft, wenn Aussagen leichter zu lesen und zu pflegen sind. Ich würde das oben Genannte nur empfehlen, wenn Sie viele Bedingungen und die Möglichkeit eines großen Wachstums in der Zukunft haben.
Aktualisieren
Wie @Brad in den Kommentaren hervorhob, sollte die Überprüfung der Obergrenze ausreichend sein, wenn sich die Bedingungen gegenseitig ausschließen (es kann jeweils nur eine zutreffen):
vorausgesetzt , die Bedingungen sind in aufsteigender Reihenfolge definiert (zuerst die niedrigste
0 to 1000
und dann1000 to 2000
zum Beispiel)quelle
action=function1
- sollten das nicht Doppelpunkte sein? ;-) - Sie können dies auch so umgestalten, dass es nur eine Obergrenze gibt, da Sie aufgrund des Eliminierungsprozesses nicht in zwei Gruppen fallen können - es sei denn, dies war Ihre Absicht (mehrere Aktionen möglich zu haben).In was genau machst du?
//do stuff
?Möglicherweise können Sie Folgendes tun:
quelle
Ungetestet und unsicher, ob dies funktioniert, aber warum nicht
if statements
vorher ein paar , um Variablen für die zu setzenswitch statement
.quelle
Dies ist eine weitere Option:
quelle
Aktualisieren der akzeptierten Antwort (kann noch nicht kommentieren). Ab dem 12.01.16 mit der Demo jsfiddle in Chrome ist Switch-Instant die schnellste Lösung.
Ergebnisse: Zeitauflösung: 1,33
Fertig
quelle
In meinem Fall (prozentuale Farbcodierung, nichts Leistungskritisches) schrieb ich schnell Folgendes:
quelle
Ich hatte in letzter Zeit die gleiche Situation, so habe ich sie gelöst:
Vor:
nach dem:
Und wenn Sie "1, 2, 3, 4, 5" einstellen, kann es noch einfacher sein:
quelle