Есть ли способ написать это на меньшем количестве строк, но при этом легко читаемым?
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
Леон Габан
источник
источник
Ответы:
Определите массив, затем перейдите по индексу.
источник
mm - 1
вы также можете установитьundefined
в качестве первого значения (индекс 0), чтобы индексы массива соответствовали номерам месяцевvar month = month[(mm -1) % 12]
mm-1
, так чтоmonths.length==12
.[undefined, 'January', 'February', ...]
- мне кажется, ваша первая реакция - WTF ?! , что обычно не является хорошим знаком ...как насчет того, чтобы вообще не использовать массив :)
согласно этому ответу Получить название месяца от Даты от Дэвида Стори
источник
new Date("2009-11-10")
Гарантированно анализируется только формат (см. Эту спецификацию: ecma-international.org/publications/standards/Ecma-262.htm ). Другие форматы даты (включая один в вашем ответе) могут быть проанализированы, если браузер выберет это, и, следовательно, не являются переносимыми.Попробуй это:
Обратите внимание, что это
mm
может быть целое число или строка, и это все равно будет работать.Если вы хотите, чтобы несуществующие ключи приводили к пустой строке
''
(вместоundefined
), добавьте эту строку:JSFiddle .
источник
var months = Object.freeze({'1': 'January', '2': 'February'}); //etc
См. Перечисления в JavaScript?Вместо этого вы можете создать массив и найти название месяца:
См. Ответ @CupawnTae для рационального использования кода
|| ''
источник
undefined
в0
качествеvar months = [ undefined, 'January','February','March', .....
Таким образом , вы будете использоватьmonth = months[mm];
Быть осторожен!
То, что должно немедленно вызвать тревогу, - это первая строка:
var month = '';
- почему эта переменная инициализируется пустой строкой, а неnull
илиundefined
? Возможно, это было просто привычкой или копированием / вставкой кода, но если вы не знаете этого наверняка, игнорировать это при рефакторинге кода небезопасно.Если вы используете массив названий месяцев и измените свой код,
var month = months[mm-1];
вы измените поведение, потому что теперь для чисел за пределами диапазона или нечисловых значенийmonth
будетundefined
. Вы можете знать, что это нормально, но во многих ситуациях это было бы плохо.Например, предположим, что вы
switch
находитесь в функцииmonthToName(mm)
, и кто-то вызывает вашу функцию следующим образом:Теперь, если вы
monthName[mm-1]
перейдете на использование массива и вернетесь , вызывающий код больше не будет работать должным образом, и он будет отправлятьundefined
значения, когда должен отображать предупреждение. Я не говорю, что это хороший код, но, если вы точно не знаете, как этот код используется, вы не можете делать предположений.Или, может быть, исходная инициализация была там, потому что некоторый код ниже по строке предполагает, что
month
это всегда будет строка, и делает что-то вродеmonth.length
- это приведет к возникновению исключения для недопустимых месяцев и потенциально полностью уничтожит вызывающий скрипт.Если вы делаете знать весь контекст - например , все это ваш собственный код, и никто еще никогда не собирается использовать его, и вы доверяете себе , не забывайте , что вы сделали изменения когда - нибудь в будущем - это может быть безопасным , чтобы изменить поведение вроде этого, но очень много ошибок возникает из-за такого предположения, что в реальной жизни вам гораздо лучше программировать в защите и / или тщательно документировать поведение.
Ответ Wasmoo дает все правильно (РЕДАКТИРОВАТЬ: ряд других ответов, включая принятый, теперь тоже исправлен) - вы можете использовать
months[mm-1] || ''
или, если вы предпочитаете, с первого взгляда сделать более очевидным, что происходит, что-то вроде:источник
undefined
? Сохраняет ли это производительность при преобразовании типа?undefined
когда ввод не был т1..12
. За исключением очень исключительных обстоятельств, правильное поведение всегда выше производительности.Для полноты картины хочу дополнить текущие ответы. По сути, вы можете опустить
break
ключевое слово и напрямую вернуть соответствующее значение. Эта тактика полезна, если значение не может быть сохранено в предварительно вычисленной справочной таблице.Еще раз, использование справочной таблицы или функций даты более кратко и субъективно лучше .
источник
Вы можете сделать это с помощью массива:
источник
Вот еще один вариант, который использует только 1 переменную и по-прежнему применяет значение по умолчанию,
''
когдаmm
находится за пределами диапазона.источник
Вы можете записать его как выражение вместо переключателя, используя условные операторы:
Если вы раньше не видели связанных условных операторов, это может показаться труднее читать. Написание его в виде выражения делает один аспект даже более заметным, чем исходный код; ясно, что целью кода является присвоение значения переменной
month
.источник
Основываясь на предыдущем ответе Cupawn Tae, я бы сократил его до:
В качестве альтернативы, да, я ценю, менее читаемый:
источник
(!!months[mm - 1])
и просто сделатьmonths[mm - 1]
.months[mm - 1]
вернетсяundefined
для индекса, выходящего за пределы допустимого диапазона. Посколькуundefined
это ложь, вы получите''
значениеmonth
.var month = months[mm - 1] || '';
источник
Как и @vidriduch, я хотел бы подчеркнуть важность i20y («интернационализации») кода в современном контексте и предложить следующее краткое и надежное решение вместе с унитарным тестом.
Я стараюсь оставаться как можно ближе к исходному вопросу, то есть преобразовывать числа от 1 до 12 в названия месяцев, не только для одного особого случая, но и возвращаться
undefined
в случае неверных аргументов, используя некоторую ранее добавленную критику и содержание других ответы. (Изменение сundefined
на''
тривиально, если требуется точное соответствие.)источник
Я бы выбрал решение wasmoo , но настроил его так:
На самом деле это тот же самый код, но с другим отступом, что IMO делает его более читабельным.
источник