Entschuldigung für diese dumme Frage. Wie kann ich eine Bedingung für einen Fall im Javascript Switch-Case-Sprachelement verwenden? Wie im folgenden Beispiel sollte ein Fall übereinstimmen, wenn die Variable liCount
<= 5 und> 0 ist. Mein Code funktioniert jedoch nicht:
switch (liCount) {
case 0:
setLayoutState('start');
var api = $('#UploadList').data('jsp');
api.reinitialise();
break;
case (liCount<=5 && liCount>0):
setLayoutState('upload1Row');
var api = $('#UploadList').data('jsp');
api.reinitialise();
break;
case (liCount<=10 && liCount>5):
setLayoutState('upload2Rows');
var api = $('#UploadList').data('jsp');
api.reinitialise();
break;
case (liCount>10):
var api = $('#UploadList').data('jsp');
api.reinitialise();
break;
}
Vielen Dank für jeden Rat!
if
s verwenden sollen, weil sie Recht haben. Dies ist eine schreckliche Anwendung vonswitch
.var liCount = 2; switch (liCount) { case 0: console.log(0); break; case (liCount<=5 && liCount>0) && liCount: console.log('liCount<=5 && liCount>0'); break; case (liCount<=10 && liCount>5) && liCount: console.log('liCount<=10 && liCount>5'); break; case (liCount>10) && liCount: console.log(liCount); break; }
Antworten:
Das funktioniert:
In einer früheren Version dieser Antwort wurden die Klammern als Schuldige angesehen. In Wahrheit sind die Klammern hier irrelevant - das einzige, was notwendig ist, ist,
switch(true){...}
dass Ihre Fallausdrücke zu Booleschen Werten ausgewertet werden.Es funktioniert, weil der Wert, den wir dem Schalter geben, als Grundlage für den Vergleich verwendet wird. Folglich bestimmen die Fallausdrücke, die auch nach Booleschen Werten ausgewertet werden, welcher Fall ausgeführt wird. Könnte dies auch umkehren und bestehen
switch(false){..}
und die gewünschten Ausdrücke als falsch anstatt als wahr bewerten lassen. Ich persönlich bevorzuge es jedoch, mit Bedingungen umzugehen, die als wahrheitsgetreu bewertet werden. Es funktioniert jedoch auch, daher sollten Sie bedenken, um zu verstehen, was es tut.Beispiel: Wenn liCount 3 ist, ist der erste Vergleich
true === (liCount == 0)
, was bedeutet, dass der erste Fall falsch ist. Der Schalter fährt dann mit dem nächsten Fall forttrue === (liCount<=5 && liCount>0)
. Dieser Ausdruck wird als wahr ausgewertet, was bedeutet, dass dieser Fall ausgeführt wird und am endetbreak
. Ich habe hier Klammern hinzugefügt, um es klarer zu machen, aber sie sind optional, abhängig von der Komplexität Ihres Ausdrucks.Es ist ziemlich einfach und eine gute Möglichkeit (wenn es zu dem passt, was Sie versuchen), mit einer langen Reihe von Bedingungen umzugehen, bei denen eine lange Reihe von
ìf() ... else if() ... else if () ...
möglicherweise viel visuelles Rauschen oder Zerbrechlichkeit mit sich bringt.Seien Sie vorsichtig, da es sich trotz gültigen Codes um ein nicht standardmäßiges Muster handelt.
quelle
switch(true) {
, undcase liCount == 0:
richtig? Ansonsten ist dieser VergleichliCount == (liCount <=5 && liCount > 0)
.switch(false) {
}Sie haben das viel zu kompliziert gemacht. Schreiben Sie es stattdessen mit if-Anweisungen wie folgt:
Oder wenn ChaosPandion versucht, so viel wie möglich zu optimieren:
quelle
setLayoutState
: P.Sie möchten if-Anweisungen verwenden:
quelle
Siehe die Antwort von dmp unten. Ich würde diese Antwort löschen, wenn ich könnte, aber sie wurde akzeptiert, also ist dies das nächstbeste :)
Das kannst du nicht. JS-Interpreter verlangen, dass Sie mit der switch-Anweisung vergleichen (z. B. gibt es keine "case when" -Anweisung). Wenn Sie dies wirklich tun möchten, können Sie einfachif(){ .. } else if(){ .. }
Blöcke erstellen.quelle
liCount
. Ich habe lediglich darauf hingewiesen, dass die ursprüngliche Aussage von cwolves, dass "JS-Interpreter erfordern, dass case-Anweisungen statische Werte sind", falsch ist. cwolves hat diese Aussage inzwischen überarbeitet, sodass mein Kommentar nicht mehr relevant ist.true
und es funktioniert. Aber es ist über 3 Jahre alt, also ist es mir eigentlich egal.funktioniert in JavaScript, solange Ihre Bedingungen die richtigen
boolean
Werte zurückgeben, hat jedoch nicht viele Vorteile gegenüberelse if
Anweisungen.quelle
10
in der switch-Anweisung übergebe? in meinem Fall nicht funktionieren nicht sicher, was der Grund ist.10 !== true
, also nein. Gibt es eine Variable, die den Wert haben könnte10
? Wennx
, danncase x === 10:
würde es funktionieren.if (10) {..}
Flow verwenden, sollte dieIf
Bedingung übergeben werden, nicht wahr? weil 10 oder eine ganze Zahl außer 0 als wahrheitsgemäßer Wert behandelt wird und es erlaubt, in die Bedingung einzutreten. Ich bin mir nicht sicher, was mit der switch-Anweisung hier falsch ist.switch
funktioniert einfach nicht soif
.if
prüft, ob die Bedingung wahr ist . Testetswitch
, ob der Ausdruck nach demswitch
ist===
( CaseClauseIsSelected Schritt 4 ) auf den Wert des Ausdrucks nachcase
.In diesem Fall sollten Sie
if
Klauseln verwenden.quelle
Wenn Sie dies tun möchten, ist es besser,
if
Anweisungen zu verwenden . Beispielsweise:quelle
Ihr Code funktioniert nicht, weil er nicht das tut, was Sie von ihm erwarten. Schalterblöcke nehmen einen Wert auf und vergleichen jeden Fall mit dem angegebenen Wert, um Gleichheit zu erreichen. Ihr Vergleichswert ist eine Ganzzahl, aber die meisten Ihrer Fallausdrücke werden in einen booleschen Wert aufgelöst.
So sagen wir zum Beispiel
liCount = 2
. Ihr erster Fall wird nicht übereinstimmen, weil2 != 0
. Ihr zweiter Fall wird(liCount<=5 && liCount>0)
mittrue
, aber bewertet2 != true
, sodass dieser Fall auch nicht übereinstimmt.Aus diesem Grund sollten Sie, wie viele andere gesagt haben, eine Reihe von
if...then...else if
Blöcken verwenden, um dies zu tun.quelle
Wenn die möglichen Werte Ganzzahlen sind, können Sie Fälle zusammenfassen. Verwenden Sie andernfalls ifs.
quelle
Beachten Sie, dass wir keine Punktzahl an den Switch übergeben, sondern true. Der Wert, den wir dem Schalter geben, wird als Vergleichsbasis verwendet.
Das folgende Beispiel zeigt, wie wir im Fall Bedingungen hinzufügen können: ohne if-Anweisungen.
quelle
Obwohl in dem speziellen Beispiel der OP-Frage dies
switch
nicht angemessen ist, gibt es ein Beispiel, in dem ein Wechsel immer noch angemessen / nützlich ist, aber auch andere Bewertungsausdrücke erforderlich sind. Dies kann erreicht werden, indem die Standardklausel für die Ausdrücke verwendet wird:quelle