Gibt es eine Möglichkeit, dies in weniger Zeilen zu schreiben, aber trotzdem gut 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;
}
Definieren Sie ein Array und rufen Sie dann den Index ab.
var months = ['January', 'February', ...];
var month = months[mm - 1] || '';
was ist mit Array überhaupt nicht zu verwenden :)
var objDate = new Date("10/11/2009"),
locale = "en-us",
month = objDate.toLocaleString(locale, { month: "long" });
console.log(month);
// or if you want the shorter date: (also possible to use "narrow" for "O"
console.log(objDate.toLocaleString(locale, { month: "short" }));
gemäß dieser Antwort Monatsname vom Datum abrufen von David Storey
Versuche dies:
var months = {'1': 'January', '2': 'February'}; //etc
var month = months[mm];
Beachten Sie, dass mm
eine Ganzzahl oder eine Zeichenfolge sein kann und weiterhin funktioniert.
Wenn nicht vorhandene Schlüssel zu einer leeren Zeichenfolge ''
(Anstelle von undefined
) führen sollen, fügen Sie diese Zeile hinzu:
month = (month == undefined) ? '' : month;
JSFiddle .
Sie können stattdessen ein Array erstellen und den Monatsnamen nachschlagen:
var months = ['January','February','March','April','May','June','July','August','September','October','November','December']
var month = months[mm-1] || '';
Siehe die Antwort von @CupawnTae für das Rationale hinter dem Code || ''
Achtung!
Das, was sofort Alarmglocken auslösen sollte, ist die erste Zeile: var month = '';
- Warum wird diese Variable nicht mit null
oder undefined
, sondern mit einer leeren Zeichenfolge initialisiert? Möglicherweise handelte es sich nur um Gewohnheits- oder Kopiercode, aber es ist nicht sicher, ihn zu ignorieren, wenn Sie den Code überarbeiten.
Wenn Sie ein Array mit Monatsnamen verwenden und Ihren Code in var month = months[mm-1];
Ändern, ändern Sie das Verhalten, da month
für Zahlen außerhalb des Bereichs oder für nicht numerische Werte undefined
. Sie wissen vielleicht, dass dies in Ordnung ist, aber es gibt viele Situationen, in denen dies schlecht wäre.
Angenommen, Ihr switch
befindet sich in einer Funktion monthToName(mm)
, und jemand ruft Ihre Funktion folgendermaßen auf:
var monthName = monthToName(mm);
if (monthName === '') {
alert("Please enter a valid month.");
} else {
submitMonth(monthName);
}
Wenn Sie nun ein Array verwenden und monthName[mm-1]
Zurückgeben, funktioniert der aufrufende Code nicht mehr wie vorgesehen und sendet undefined
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 Teil des Codes weiter unten in der Zeile davon ausgeht, dass month
immer eine Zeichenfolge ist und etwas wie month.length
Ausführt - dies führt dazu, dass eine Ausnahme für ungültige Monate ausgelöst wird und möglicherweise das aufrufende Skript vollständig beenden.
Wenn Sie den gesamten Kontext kennen , z. Es ist alles Ihr eigener Code, und niemand anderes wird ihn jemals verwenden. und Sie vertrauen darauf, dass Sie nicht vergessen, dass Sie die Änderung irgendwann in der Zukunft vorgenommen haben - Es mag sicher sein, das Verhalten so zu ändern, aber so viele Fehler gehen von der Annahme aus, dass Sie im wirklichen Leben weitaus besser in der Lage sind, 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 ebenfalls korrigiert) - Sie können months[mm-1] || ''
verwenden oder, wenn Sie es vorziehen, auf einen Blick klarer zu machen, was passiert, so etwas wie:
var months = ['January', 'February', ...];
var month;
if (mm >= 1 && m <= 12) {
month = months[mm - 1];
} else {
month = ''; // empty string when not a valid month
}
Der Vollständigkeit halber möchte ich die aktuellen Antworten ergänzen. Grundsätzlich können Sie das Schlüsselwort break
weglassen und direkt einen entsprechenden Wert zurückgeben. Diese Taktik ist nützlich, wenn der Wert nicht in einer vorberechneten Nachschlagetabelle gespeichert werden kann.
function foo(mm) {
switch(mm) {
case '1': return 'January';
case '2': return 'February';
case '3': return 'March';
case '4': return 'April';
// [...]
case '12': return 'December';
}
return '';
}
Auch hier ist die Verwendung einer Nachschlagetabelle oder von Datumsfunktionen prägnanter und subjektiver besser.
Sie könnten es mit einem Array tun:
var months = ['January', 'February', 'March', 'April',
'May', 'June', 'July', 'August',
'September', 'October', 'November', 'December'];
var month = months[mm - 1] || '';
Hier ist eine weitere Option, die nur 1 Variable verwendet und dennoch den Standardwert ''
Anwendet, wenn mm
außerhalb des Bereichs liegt.
var month = ['January', 'February', 'March',
'April', 'May', 'June', 'July',
'August', 'September', 'October',
'November', 'December'
][mm-1] || '';
Sie könnten es als Ausdruck anstelle eines Schalters mit bedingten Operatoren schreiben:
var month =
mm == 1 ? 'January' :
mm == 2 ? 'February' :
mm == 3 ? 'March' :
mm == 4 ? 'April' :
mm == 5 ? 'May' :
mm == 6 ? 'June' :
mm == 7 ? 'July' :
mm == 8 ? 'August' :
mm == 9 ? 'September' :
mm == 10 ? 'October' :
mm == 11 ? 'November' :
mm == 12 ? 'December' :
'';
Wenn Sie noch keine verketteten bedingten Operatoren gesehen haben, ist dies auf den ersten Blick möglicherweise schwerer zu lesen. Durch das Schreiben als Ausdruck ist ein Aspekt noch besser zu erkennen als der ursprüngliche Code. Es ist klar, dass der Code der Variablen month
einen Wert zuweisen soll.
Aufbauend auf Cupawn Tae's antworte vorher Ich würde es verkürzen auf:
var months = ['January', 'February', ...];
var month = (mm >= 1 && mm <= 12) ? months[mm - 1] : '';
Alternativ, ja, ich schätze, weniger lesbar:
var month = months[mm - 1] || ''; // as mentioned further up
Wie @vidriduch möchte ich die Bedeutung von i20y ("Internationalisierbarkeit") von Code im heutigen Kontext unterstreichen und die folgende prägnante und robuste Lösung zusammen mit dem einheitlichen Test vorschlagen.
function num2month(month, locale) {
if (month != Math.floor(month) || month < 1 || month > 12)
return undefined;
var objDate = new Date(Math.floor(month) + "/1/1970");
return objDate.toLocaleString(locale, {month: "long"});
}
/* Test/demo */
for (mm = 1; mm <= 12; mm++)
document.writeln(num2month(mm, "en") + " " +
num2month(mm, "ar-lb") + "<br/>");
document.writeln(num2month("x", "en") + "<br/>");
document.writeln(num2month(.1, "en") + "<br/>");
document.writeln(num2month(12.5, "en" + "<br/>"));
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 bei ungültigen Argumenten undefined
mit einigen der zuvor hinzugefügten zurückzugeben Kritik und Inhalt anderer Antworten. (Der Wechsel von undefined
zu ''
ist trivial, falls gena Übereinstimmung benötigt wird.)
var getMonth=function(month){
//Return string to number.
var strMonth = ['January', 'February', 'March',
'April', 'May', 'June', 'July',
'August', 'September', 'October',
'November', 'December'
];
//return number to string.
var intMonth={'January':1, 'February':2, 'March':3,
'April':4, 'May':5, 'June':6, 'July':7,
'August':8, 'September':9, 'October':10,
'November':11, 'December':12
};
//Check type and return
return (typeof month === "number")?strMonth[month-1]:intMonth[month]
}
Ich würde mich für die Lösung von wasmoo entscheiden, sie aber wie folgt anpassen:
var month = [
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
][mm-1] || '';
Eigentlich ist es genau derselbe Code, der jedoch unterschiedlich eingerückt ist, wodurch IMO die Lesbarkeit verbessert.