2013-08-14 3 views
6

Gibt es eine Möglichkeit, mehrere Fälle in einer einzigen Javascript-Switch-Anweisung zu erstellen?Switch kombiniert Fälle String Regex und Nummer

In meinem Code erhalte ich den Wert eines Feldes über jQuery.

Ist es möglich, dass ein Fall nach String-Regex und ein anderer nach Nummer derselben Variablen sucht?

ich entlang der Linien von denke:

var field = $(this).val(); 
var msg; 
switch (field) 
{ 
    case field.test('Yes'): 

    msg = "FOO\n"; 
    break; 

    case 10: 
    msg = "BAR\n"; 
    break; 
} 

Obwohl ich hier gesehen: Switch statement for string matching in JavaScript

Dass der Wechselschalter zu verwenden, um auf Strings ist ein Wert „true“ die switch-Anweisung durch das Senden.

Was wäre der prägnanteste (und korrekte!) Weg, dies zu erreichen?

+0

Meiner Meinung nach einem 'if/else' das wäre prägnant und korrekt, vor allem wenn es nur zwei Fälle gibt. Wenn es weitere Fälle gibt, fügen Sie entweder 'else if'-Verzweigungen nach Bedarf hinzu oder schließen Sie alle Zahlenfälle zuerst in einen 'switch' ein und führen Sie dann die Regex-Tests in einem' default' aus. Sie können 'switch (true)' verwenden und dann für jeden 'Fall' die gewünschten Bedingungen einstellen, in der Tat habe ich das selbst gemacht, aber es neigt nur dazu, den Code kürzer zu machen, wenn es Fall-Through-Fälle gibt ... – nnnnnn

+0

ab jetzt gibt es drei, aber es könnte mehr in der Zukunft, ich möchte der Code leicht erweiterbar sein und wenn/sonst ist nicht so ... – J00MZ

Antwort

11

OK, Kompilieren beiden Antworten über meinem Code, gearbeitet und (meiner Meinung nach) war sehr elegant ist:

var fieldVal = $(this).val(); 

var msg; 

switch (true) 
{ 
    case /Yes/.test(fieldVal): 
     msg = "FOO"; 
     break; 
    case fieldVal > 10 : 
     msg = "BAR"; 
     break; 
} 

dieses als separates funktioniert, wenn Aussagen, da wir evaluieren, ob der Fall wieder wahr, aber in einer klareren und prägnanteren Weise, die uns die Möglichkeit geben könnte, völlig unterschiedliche Testanweisungen in einem Schalter hinzuzufügen.

der Grund funktioniert es ist wahrscheinlich, dass der Fall Ausdruck ausgewertet wird als wahr oder falsch interpretiert Wert und dann geprüft, gegen die Haupt - Schalter (true)

0

Sie können nicht der Fall zu einzelnen Wert müssen, ist, dass im Vergleich Ausdruck zu wechseln, sondern können Sie mehrere Fälle stellen den gleichen Code ausführen:

switch (field) { 
    case 'Yes': 
    case 'yes': 
    case 'YES': 
     msg = "FOO\n"; 
     break; 

    case 10: 
     msg = "BAR\n"; 
     break; 
} 

aber um können Sie testen, wie Fall zu verwenden, geben wahr zu wechseln (fand ich diesen Trick in einigen Open-Source-Projekt):

switch (true) { 
    case field.test('Yes'): 
     msg = "FOO\n"; 
     break; 
    case field == 10: 
     msg = "BAR\n"; 
     break; 
} 

aber dies ist das gleiche wie if/else

0

Hinweis: Sie verwenden test() falsch, es ist eine Methode eines Regex-Objekts, so dass Sie /Yes/.test(field) statt field.test('Yes') benötigen. Wie auch immer ...

Wenn Sie nur zwei Fälle, wie gezeigt haben, dann würde ich eine if/else/else if Struktur verwenden:

var field = $(this).val(); 
var msg; 
if(/Yes/.test(field)) { 
    msg = "FOO\n"; 
} else if (field === 10) { 
    msg = "BAR\n"; 
} 

Wenn Sie weitere Fälle hinzufügen müssen würde ich nur hinzufügen, zusätzliche if else {} Filialen auf das Ende.

Wenn Sie mehrere bestimmte numerische Fällen prüfen Sie könnten sie in einem switch mit den regex Tests in einem default am Ende setzen:

switch (field) { 
    case 10: 
     msg = "BAR\n"; 
     break; 
    case 30: 
     msg = "whatever\n"; 
     break; 
    case 50: 
     msg = "hi\n"; 
     break; 
    default: 
     if (/Yes/.test(field)) { 
      msg = "FOO\n"; 
     else if (/No|N|False|/i.test(field)) { 
      msg = "blah\n"; 
     } 
     break; 
} 

Die switch (true) Option, die Sie in der Frage angedeutet ist wirklich ein einfach messier Version eines if/else/else if, so dass es nicht wirklich Sinn machen, es sei denn, Sie einige durch~~POS=TRUNC Fälle haben:

switch(true) 
    case /Yes/.test(field): 
    case /Y/.text(field): 
    case /Whatever/.text(field): 
     msg = "FOO\n"; 
     break; 
    case field == 10: 
     msg = "BAR\n"; 
     break; 
} 

... und selbst dann ist ein if mit mehreren Bedingungen, die durch || wohl genauso mit geeigneten Zeilenumbrüchen verbunden sind, und mehrere Regexes zu einem einzigen zu kombinieren, wahrscheinlich viel besser.

+0

nur um zu klären, ich überprüfe nicht, ob der Feldwert ist ein String oder Zahl, aber eine bestimmte Zahl oder eine Zeichenfolge eines Variablenfeldes. – J00MZ

+0

Ja, ist das nicht das Szenario in meiner Antwort? – nnnnnn