2013-08-14 5 views
6

Czy istnieje sposób na utworzenie wielu przypadków w pojedynczej instrukcji przełączania JavaScript?Przełącznik łączenia przypadków ciąg regex i numer

W moim kodzie otrzymuję wartość pola za pośrednictwem jQuery.

Czy to możliwe, że jeden przypadek sprawdza ciąg regex, a drugi numer tej samej zmiennej?

myślę wzdłuż linii:

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

    msg = "FOO\n"; 
    break; 

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

Chociaż widziałem tutaj: Switch statement for string matching in JavaScript

że sposób używać przełącznika na strunach jest poprzez wysłanie instrukcji switch „prawdziwą” wartość.

Jaki byłby najbardziej zwięzły (i poprawny!) Sposób, aby to osiągnąć?

+0

Moim zdaniem obiekt 'if/else' byłoby najbardziej zwięzły i poprawny sposób, zwłaszcza jeśli istnieją tylko dwa przypadki. Jeśli są dodatkowe przypadki, dodaj albo w razie potrzeby jakieś gałęzie 'else if', albo najpierw umieść wszystkie numery w' switch', a następnie wykonaj testy regex w 'default'. Możesz użyć 'switch (true)', a następnie ustawić dowolne warunki dla każdego "przypadku", faktycznie zrobiłem to sam, ale to tylko powoduje, że kod jest krótszy, gdy są przypadki przechodzenia ... – nnnnnn

+0

od teraz są trzy, ale może być ich więcej w przyszłości, chciałbym, żeby kod był łatwy do rozszerzenia i jeśli/inaczej nie jest tak ... – J00MZ

Odpowiedz

11

OK, kompilacja obie odpowiedzi powyżej mojego kodu, który pracował i (moim zdaniem) był najbardziej elegancki jest:

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

var msg; 

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

to działa jako oddzielny if ponieważ oceniający, czy przypadek zwraca true, ale w bardziej przejrzysty i zwięzły sposób, który dałby nam możliwość dodania zupełnie różnych instrukcji testowych w jednym przełączniku.

przyczyną tego, że działa to prawdopodobnie, że sprawa wyrażenie oceniana jest interpretowana jako wartość prawdziwą lub fałszywą, a następnie porównywane głównej - przełącznika (prawdziwego)

0

Nie możesz przypadek trzeba pojedynczej wartości, które w porównaniu do przełączania wyrażenie, ale można umieścić wiele przypadków, aby wykonać ten sam kod:

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

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

ale aby wykorzystać badania w przypadku można przechodzą prawdziwe, aby przełączyć (Znalazłem ten trick w jakimś projekcie open source):

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

ale to jest taka sama jak if/else

0

Uwaga: używasz test() niepoprawnie, jest to metoda obiektu regex, więc potrzebujesz /Yes/.test(field) zamiast field.test('Yes'). W każdym razie ...

Jeśli masz tylko dwa przypadki, jak pokazano to bym użyć if/else/else if strukturę:

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

Jeśli trzeba dodać dodatkowe przypadki, ja po prostu dodać dodatkowe oddziały na if else {} koniec.

Jeśli masz kilka konkretnych przypadków numerycznych można rozważyć umieszczenie ich w switch z testami regex w default na koniec:

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; 
} 

switch (true) opcja nawiązywał w tej kwestii jest naprawdę tylko Messier wersja o if/else/else if, więc to naprawdę nie ma sensu chyba masz jakieś spadkiem przez przypadki:

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; 
} 

... i nawet wtedy if z wieloma warunkami połączonymi przez ||, prawdopodobnie tak samo uporządkowanymi z odpowiednimi znakami nowej linii, i łączenie wielu wyrażeń regularnych w jedno, jest prawdopodobnie dużo lepsze.

+0

żeby wyjaśnić, nie sprawdzam, czy wartość pola jest ciąg lub liczba, ale określona liczba lub ciąg zmiennej pola. – J00MZ

+0

Tak, czy scenariusz nie jest objęty moją odpowiedzią? – nnnnnn