2010-04-23 5 views
35

Schreibe ich den richtigen Schalterkasten?Schaltergehäuse mit Bedingungen

var cnt = $("#div1 p").length; 
       alert(cnt); 
       switch (cnt) { 
        case (cnt >= 10 && cnt <= 20): 
         alert('10'); 
         break; 
        case (cnt >= 21 && cnt <= 30): 
         alert('21'); 
         break; 
        case (cnt >= 31 && cnt <= 40): 
       alert('31'); 
         break; 
        default: 
         alert('>41'); 
       } 

Aus irgendeinem Grund tritt die Warnung nicht auf, wenn die Bedingungen übereinstimmen!

+3

haben Sie davon gehört, wenn ... elseif ... else-Anweisung? – rochal

+1

IMO die richtige Antwort auf diese Frage erhielt die wenigsten Stimmen. Siehe die Antwort von Fabien Ménager. Dies sollte der richtige sein. Das Schreiben dieser Art von Code mithilfe von switch ist besser lesbar als die Verwendung von if else-Anweisungen. Ich benutze diesen hier in solchen Situationen. – Foreever

Antwort

26

Sie sollten switch für dieses Szenario nicht verwenden. Dies ist der richtige Ansatz:

var cnt = $("#div1 p").length; 

alert(cnt); 

if (cnt >= 10 && cnt <= 20) 
{ 
    alert('10'); 
} 
else if (cnt >= 21 && cnt <= 30) 
{ 
    alert('21'); 
} 
else if (cnt >= 31 && cnt <= 40) 
{ 
    alert('31'); 
} 
else 
{ 
    alert('>41'); 
} 
+12

Es gibt nichts falsch in der Verwendung von Schalter in diesem Szenario. Ich ziehe es vor, umzuschalten, wenn das sonst so ist. – Foreever

+7

"Sie sollten keinen Schalter für dieses Szenario verwenden" ** Warum? ** – Fr0zenFyr

7

Was Sie tun, ist nach (0) oder (1) Ergebnissen zu suchen.

(cnt> = 10 & & cnt < = 20) gibt entweder wahr oder falsch zurück.

--edit-- Sie können nicht Fall mit boolean (Logik) experessions verwenden. Die Anweisung cnt> = 10 gibt null für false oder eins für wahr zurück. Daher wird es Fall (1) oder Fall (0) geben, der niemals mit der Länge übereinstimmt. --edit--

+1

Andy, du hast wahrscheinlich einen Punkt hier, dem ich nicht folgen kann. Was mache ich falsch? – Jasl

+0

Sie können nicht mit booleschen (logischen) Berechnungen arbeiten.Die Anweisung cnt> = 10 gibt null für false oder eins für wahr zurück. Daher wird es Fall (1) oder Fall (0) geben, der niemals mit der Länge übereinstimmt. – jAndy

+0

Weitere Informationen über 'switch()' http://www.w3schools.com/js/js_switch.asp – Reigel

22

Das mit dieser Arbeit sollte:

var cnt = $("#div1 p").length; 

      switch (true) { 
       case (cnt >= 10 && cnt <= 20): 
        alert('10'); 
        break; 
       case (cnt >= 21 && cnt <= 30): 
        alert('21'); 
        break; 
       case (cnt >= 31 && cnt <= 40): 
        break; 
       default: 
        alert('>41'); 
      } 
+1

Ich habe nicht gesagt, das ist ein guter Code;) Und Schalter erlaubt dies. Das ist wie beim Schreiben von 'if (2 == myVar)' –

+3

Es ist nichts falsch mit dieser switch-Anweisung und es ist genau so, wie es beabsichtigt ist. Übersetzt, du fragst "gib mir die" wahre "Aussage" und führe diesen Code dafür aus. Ich persönlich mag die switch-Anweisung besser als eine Reihe von if..else if .. Aussagen. –

+1

Sie ersetzen besser> = 21 mit> 20 und so weiter. – Haradzieniec

82

Ein Schalter funktioniert durch den Vergleich, was zu jedem case in switch() ist.

switch (cnt) { 
    case 1: .... 
    case 2: .... 
    case 3: .... 
} 

funktioniert wie:

if (cnt == 1) ... 
if (cnt == 2) ... 
if (cnt == 3) ... 

Daher Sie jede Logik in den Case-Anweisungen nicht haben kann.

switch (cnt) { 
    case (cnt >= 10 && cnt <= 20): ... 
} 

Werke wie

if (cnt == (cnt >= 10 && cnt <= 20)) ... 

und das ist nur Unsinn. :)

Verwenden Sie stattdessen if() { } else if() { } else { }.

+0

gute Erklärung, danke –

+0

kann nicht mehr zustimmen mit Ihrem '' '' Nonsense'''' Teil – Jay

10

Etwas, das ich kam auf bei dem Versuch war ein Spinner zu arbeiten, um für Flexibilität innerhalb des Skripts ohne die Verwendung einer Tonne wenn Aussagen zu ermöglichen.

Da dies eine einfachere Lösung ist, als durch ein Array zu iterieren, um nach einer einzelnen Instanz einer vorhandenen Klasse zu suchen, hält es das Skript sauberer. Vorschläge zur weiteren Reinigung des Codes sind willkommen.

$('.next').click(function(){ 
     var imageToSlide = $('#imageSprite'); // Get id of image 

     switch(true) { 
      case (imageToSlide.hasClass('pos1')): 
       imageToSlide.removeClass('pos1').addClass('pos2'); 
       break; 
      case (imageToSlide.hasClass('pos2')): 
       imageToSlide.removeClass('pos2').addClass('pos3'); 
       break; 
      case (imageToSlide.hasClass('pos3')): 
       imageToSlide.removeClass('pos3').addClass('pos4'); 
       break; 
      case (imageToSlide.hasClass('pos4')): 
       imageToSlide.removeClass('pos4').addClass('pos1'); 
     } 
    }); ` 
1

Schalter Fall ist jede Hilfe voll statt, wenn else-Anweisung:

 switch ($("[id*=btnSave]").val()) { 
     case 'Search': 
      saveFlight(); 
      break; 
     case 'Update': 
      break; 
     case 'Delete': 
      break; 
     default: 
      break; 
    } 
3
function date_conversion(start_date){ 
    var formattedDate = new Date(start_date); 
    var d = formattedDate.getDate(); 
    var m = formattedDate.getMonth(); 
    var month; 
    m += 1; // JavaScript months are 0-11 
    switch (m) { 
     case 1: { 
      month="Jan"; 
      break; 
     } 
     case 2: { 
      month="Feb"; 
      break; 
     } 
     case 3: { 
      month="Mar"; 
      break; 
     } 
     case 4: { 
      month="Apr"; 
      break; 
     } 
     case 5: { 
      month="May"; 
      break; 
     } 
     case 6: { 
      month="Jun"; 
      break; 
     } 
     case 7: { 
      month="Jul"; 
      break; 
     } 
     case 8: { 
      month="Aug"; 
      break; 
     } 
     case 9: { 
      month="Sep"; 
      break; 
     } 
     case 10: { 
      month="Oct"; 
      break; 
     } 
     case 11: { 
      month="Nov"; 
      break; 
     } 
     case 12: { 
      month="Dec"; 
      break; 
     } 
    } 
    var y = formattedDate.getFullYear(); 
    var now_date=d + "-" + month + "-" + y; 
    return now_date; 
}