Gibt es eine Möglichkeit, dies in weniger Zeilen zu schreiben, aber dennoch leicht lesbar?
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
quelle
quelle
Antworten:
Definieren Sie ein Array und ermitteln Sie es anhand des Index.
quelle
mm - 1
können Sie auchundefined
den ersten Wert (Index 0)var month = month[(mm -1) % 12]
mm-1
, damitmonths.length==12
.[undefined, 'January', 'February', ...]
- ich bin der Meinung, Ihre erste Reaktion ist WTF?! , was normalerweise kein gutes Zeichen ist ...Was ist mit Array überhaupt nicht zu verwenden :)
gemäß dieser Antwort Holen Sie sich den Monatsnamen vom Datum von David Storey
quelle
new Date("2009-11-10")
wird garantiert, dass nur das Format analysiert wird (siehe diese Spezifikation : ecma-international.org/publications/standards/Ecma-262.htm ). Andere Datumsformate (einschließlich eines in Ihrer Antwort) können analysiert werden, wenn der Browser dies wünscht, und sind daher nicht portierbar.Versuche dies:
Beachten Sie, dass
mm
dies eine Ganzzahl oder eine Zeichenfolge sein kann und weiterhin funktioniert.Wenn nicht vorhandene Schlüssel zu einer leeren Zeichenfolge
''
(anstelle vonundefined
) führen sollen, fügen Sie diese Zeile hinzu:JSFiddle .
quelle
var months = Object.freeze({'1': 'January', '2': 'February'}); //etc
See Aufzählungen in JavaScript?Sie können stattdessen ein Array erstellen und den Monatsnamen nachschlagen:
In der Antwort von @CupawnTae finden Sie die Gründe für den Code
|| ''
quelle
undefined
an ,0
wievar months = [ undefined, 'January','February','March', .....
Sie verwenden , um auf diese Weisemonth = months[mm];
Achtung!
Das, was sofort Alarmglocken auslösen sollte, ist die erste Zeile:
var month = '';
- Warum wird diese Variable mit einer leeren Zeichenfolge initialisiert und nicht mitnull
oderundefined
? Möglicherweise war es nur Gewohnheit oder kopierter / eingefügter Code, aber wenn Sie das nicht sicher wissen, ist es nicht sicher, ihn zu ignorieren, wenn Sie Code umgestalten.Wenn Sie eine Reihe von Monatsnamen verwenden und den Code ändern , um
var month = months[mm-1];
das Verhalten ändern, weil jetzt Zahlen außerhalb des Bereichs, oder nicht-numerische Wertemonth
werdenundefined
. Sie wissen vielleicht, dass dies in Ordnung ist, aber es gibt viele Situationen, in denen dies schlecht wäre.Nehmen wir zum Beispiel an, Sie
switch
befinden sich in einer FunktionmonthToName(mm)
und jemand ruft Ihre Funktion folgendermaßen auf:Wenn Sie nun ein Array verwenden und zurückkehren
monthName[mm-1]
, funktioniert der aufrufende Code nicht mehr wie beabsichtigt und sendetundefined
Werte, wenn eine Warnung angezeigt werden soll. Ich sage nicht, dass dies guter Code ist, aber wenn Sie nicht genau wissen, wie der Code verwendet wird, können Sie keine Annahmen treffen.Oder vielleicht war die ursprüngliche Initialisierung dort, weil ein Code weiter unten davon ausgeht, dass
month
es sich immer um eine Zeichenfolge handelt, und so etwas tutmonth.length
- dies führt dazu, dass eine Ausnahme für ungültige Monate ausgelöst wird und das aufrufende Skript möglicherweise vollständig beendet wird.Wenn Sie tun , den gesamten Kontext kennen - zB es ist alles Ihren eigenen Code, und sonst niemand wird es jemals nicht benutzen wollen, und Sie vertrauen sich nicht vergessen Sie die Änderung in der Zukunft gemacht - es kann sicher sein , das Verhalten zu ändern so, aber soooo viele Fehler kommen von dieser Art der Annahme, dass es im wirklichen Leben weitaus besser ist, defensiv zu programmieren und / oder das Verhalten gründlich zu dokumentieren.
Wasmoos Antwort macht es richtig (BEARBEITEN: Eine Reihe anderer Antworten, einschließlich der akzeptierten, wurden jetzt ebenfalls korrigiert ) - Sie können verwenden
months[mm-1] || ''
oder wenn Sie es vorziehen, auf einen Blick deutlicher zu machen, was passiert, so etwas wie:quelle
undefined
? Spart das Leistung, wenn der Typ konvertiert wird?undefined
wenn die Eingabe nicht erfolgte 't1..12
. Außer unter sehr außergewöhnlichen Umständen übertrifft korrektes Verhalten jedes Mal die Leistung.Der Vollständigkeit halber möchte ich die aktuellen Antworten ergänzen. Grundsätzlich können Sie das
break
Schlüsselwort auslassen und direkt einen geeigneten Wert zurückgeben. Diese Taktik ist nützlich, wenn der Wert nicht in einer vorberechneten Nachschlagetabelle gespeichert werden kann.Auch hier ist die Verwendung einer Nachschlagetabelle oder von Datumsfunktionen prägnanter und subjektiv besser .
quelle
Sie können dies mit einem Array tun:
quelle
Hier ist eine weitere Option, die nur 1 Variable verwendet und dennoch den Standardwert anwendet,
''
wenn diesermm
außerhalb des Bereichs liegt.quelle
Sie können es als Ausdruck anstelle eines Schalters schreiben, indem Sie bedingte Operatoren verwenden:
Wenn Sie noch keine verketteten bedingten Operatoren gesehen haben, ist dies zunächst möglicherweise schwerer zu lesen. Wenn Sie es als Ausdruck schreiben, ist ein Aspekt noch einfacher zu erkennen als der ursprüngliche Code. Es ist klar, dass der Code der Variablen einen Wert zuweisen soll
month
.quelle
Aufbauend auf der vorherigen Antwort von Cupawn Tae würde ich sie verkürzen auf:
Alternativ ja, ich schätze, weniger lesbar:
quelle
(!!months[mm - 1])
und einfach tunmonths[mm - 1]
.months[mm - 1]
wirdundefined
für einen Index zurückgegeben, der außerhalb des Bereichs liegt. Daundefined
es falsch ist, werden Sie''
als Wert von endenmonth
.var month = months[mm - 1] || '';
quelle
Wie bei @vidriduch möchte ich die Bedeutung von i20y ("Internationalisierbarkeit") von Code im heutigen Kontext hervorheben und zusammen mit dem einheitlichen Test die folgende prägnante und robuste Lösung vorschlagen.
Ich versuche, der ursprünglichen Frage so nahe wie möglich zu kommen, dh die Zahlen 1 bis 12 nicht nur für einen Sonderfall in Monatsnamen umzuwandeln, sondern
undefined
bei ungültigen Argumenten zurückzukehren, indem ich einige der zuvor hinzugefügten Kritikpunkte und Inhalte anderer verwende Antworten. (Der Wechsel vonundefined
zu''
ist trivial, falls eine genaue Übereinstimmung erforderlich ist.)quelle
Ich würde mich für die Lösung von wasmoo entscheiden , aber sie wie folgt anpassen:
Es ist wirklich genau derselbe Code, aber anders eingerückt, was IMO ihn lesbarer macht.
quelle