Czy istnieje sposób na zapisanie tego w mniejszej liczbie wierszy, ale nadal łatwe do odczytania?
var month = '';
switch(mm) {
case '1':
month = 'January';
break;
case '2':
month = 'February';
break;
case '3':
month = 'March';
break;
case '4':
month = 'April';
break;
case '5':
month = 'May';
break;
case '6':
month = 'June';
break;
case '7':
month = 'July';
break;
case '8':
month = 'August';
break;
case '9':
month = 'September';
break;
case '10':
month = 'October';
break;
case '11':
month = 'November';
break;
case '12':
month = 'December';
break;
}
javascript
date
switch-statement
date-format
Leon Gaban
źródło
źródło
Odpowiedzi:
Zdefiniuj tablicę, a następnie pobierz według indeksu.
źródło
mm - 1
ciebie możesz również ustawićundefined
jako pierwszą wartość (indeks 0), aby indeksy tablicy były zgodne z numerami miesięcyvar month = month[(mm -1) % 12]
mm-1
, więc tomonths.length==12
.[undefined, 'January', 'February', ...]
- najlepiej, że twoją pierwszą reakcją jest WTF ?! , co zwykle nie jest dobrym znakiem ...a co by w ogóle nie używać tablicy :)
zgodnie z tą odpowiedzią Pobierz nazwę miesiąca z Data od Davida Storeya
źródło
new Date("2009-11-10")
format ma być przeanalizowany (zobacz tę specyfikację : ecma-international.org/publications/standards/Ecma-262.htm ). Inne formaty dat (w tym jeden w Twojej odpowiedzi) mogą być analizowane, jeśli tak zdecyduje przeglądarka, i dlatego nie są przenośne.Spróbuj tego:
Zauważ, że
mm
może to być liczba całkowita lub łańcuch i nadal będzie działać.Jeśli chcesz, aby nieistniejące klucze skutkowały pustym ciągiem
''
(zamiastundefined
), dodaj tę linię:JSFiddle .
źródło
var months = Object.freeze({'1': 'January', '2': 'February'}); //etc
Zobacz wyliczenia w JavaScript?Zamiast tego możesz utworzyć tablicę i wyszukać nazwę miesiąca:
Zobacz odpowiedź @CupawnTae, aby poznać uzasadnienie kodu
|| ''
źródło
undefined
w0
jakvar months = [ undefined, 'January','February','March', .....
W ten sposób można wykorzystaćmonth = months[mm];
Bądź ostrożny!
To, co powinno natychmiast wywołać dzwonki alarmowe, to pierwsza linia:
var month = '';
- dlaczego ta zmienna jest inicjalizowana jako pusty łańcuch, a nienull
lubundefined
? Być może był to po prostu nawyk lub kopiowanie / wklejanie kodu, ale jeśli nie wiesz tego na pewno, nie jest bezpiecznie ignorować go podczas refaktoryzacji kodu.Jeśli używasz tablicy nazw miesięcy i zmienisz swój kod
var month = months[mm-1];
, zmieniasz zachowanie, ponieważ teraz dla liczb spoza zakresu lub wartości nienumerycznychmonth
będzieundefined
. Możesz wiedzieć, że to jest w porządku, ale jest wiele sytuacji, w których byłoby to złe.Na przykład, powiedzmy, że twoja
switch
jest w funkcjimonthToName(mm)
, a ktoś wywołuje twoją funkcję w ten sposób:Teraz, jeśli zmienisz na używanie tablicy i zwrócisz
monthName[mm-1]
, kod wywołujący nie będzie już działał zgodnie z przeznaczeniem i prześleundefined
wartości, gdy ma wyświetlić ostrzeżenie. Nie twierdzę, że to dobry kod, ale jeśli nie wiesz dokładnie, jak kod jest używany, nie możesz robić założeń.A może oryginalna inicjalizacja była tam, ponieważ jakiś kod w dalszej części linii zakłada, że
month
zawsze będzie to ciąg, i robi coś w rodzajumonth.length
- spowoduje to wyrzucenie wyjątku dla nieprawidłowych miesięcy i potencjalnie całkowicie zabije skrypt wywołujący.Jeśli zrobić znać cały kontekst - np to wszystko swój własny kod, a nikt inny kiedykolwiek będzie go używać, i ufasz sobie nie zapomnieć dokonaniu kiedyś zmieni się w przyszłości - może być bezpieczny, aby zmienić zachowanie w ten sposób, ale bardzo wiele błędów wynika z tego rodzaju założenia, że w prawdziwym życiu znacznie lepiej jest programować defensywnie i / lub dokładnie dokumentować zachowanie.
Odpowiedź Wasmoo ma rację (EDYTUJ: kilka innych odpowiedzi, w tym zaakceptowana, również zostało naprawionych) - możesz użyć
months[mm-1] || ''
lub jeśli wolisz, aby było bardziej oczywiste na pierwszy rzut oka, co się dzieje, na przykład:źródło
undefined
? Czy to oszczędza wydajność, jeśli typ zostanie przekonwertowany?undefined
gdy dane wejściowe nie były 't1..12
. Z wyjątkiem bardzo wyjątkowych okoliczności, prawidłowe zachowanie jest zawsze ważniejsze od wydajności.Dla kompletności chciałbym uzupełnić aktualne odpowiedzi. Zasadniczo można pominąć
break
słowo kluczowe i bezpośrednio zwrócić odpowiednią wartość. Ta taktyka jest przydatna, jeśli wartość nie może być przechowywana we wstępnie obliczonej tabeli przeglądowej.Ponownie, użycie tabeli przeglądowej lub funkcji daty jest bardziej zwięzłe i subiektywnie lepsze .
źródło
Możesz to zrobić za pomocą tablicy:
źródło
Oto kolejna opcja, która używa tylko 1 zmiennej i nadal stosuje wartość domyślną,
''
gdymm
jest poza zakresem.źródło
Możesz zapisać to jako wyrażenie zamiast przełącznika, używając operatorów warunkowych:
Jeśli wcześniej nie widziałeś łańcuchowych operatorów warunkowych, na początku może się to wydawać trudniejsze do odczytania. Zapisanie go jako wyrażenia sprawia, że jeden aspekt jest jeszcze łatwiejszy do zobaczenia niż oryginalny kod; jasne jest, że intencją kodu jest przypisanie wartości zmiennej
month
.źródło
Opierając się na poprzedniej odpowiedzi Cupawn Tae , skróciłbym ją do:
Ewentualnie tak, doceniam, mniej czytelne:
źródło
(!!months[mm - 1])
i po prostu zrobićmonths[mm - 1]
.months[mm - 1]
zwróciundefined
wartość indeksu, który jest poza zakresem. Odundefined
jest fałszywe, otrzymasz''
jako wartośćmonth
.var month = months[mm - 1] || '';
źródło
Podobnie jak @vidriduch, chciałbym podkreślić znaczenie i20y („internacjonalizacji”) kodu w dzisiejszym kontekście i zasugerować następujące zwięzłe i solidne rozwiązanie wraz z testem jednostkowym.
Staram się pozostać jak najbliżej pierwotnego pytania, tj. Przekształcić liczby od 1 do 12 w nazwy miesięcy, nie tylko dla jednego specjalnego przypadku, ale powrócić
undefined
w przypadku niepoprawnych argumentów, wykorzystując część wcześniej dodanej krytyki i treści innych odpowiedzi. (Zmiana zundefined
na''
jest trywialna, jeśli potrzebne jest dokładne dopasowanie).źródło
Pójdę za wasmoo roztworu „s, ale dostosować go tak:
W rzeczywistości jest to dokładnie ten sam kod, ale z innymi wcięciami, dzięki czemu jest on bardziej czytelny.
źródło