wake-up-neo.com

Wie kann man den Schaltkastenblock verkürzen, indem man eine Zahl in einen Monatsnamen umwandelt?

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;
}
110
Leon Gaban

Definieren Sie ein Array und rufen Sie dann den Index ab.

var months = ['January', 'February', ...];

var month = months[mm - 1] || '';
199
xdazz

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

81
vidriduch

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 || ''

26
Jaco

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
}
19
CupawnTae

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.

17
Gerard

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] || '';
16
Stuart Wagner

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] || '';
12
Wasmoo

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.

9
Guffa

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
6

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.)

4
Dirk
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]
}
4
Laxmikant Dange

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.

0
John Slegers