Javascript 如何缩短将数字转换为月份名称的开关盒块?

Javascript 如何缩短将数字转换为月份名称的开关盒块?,javascript,date,switch-statement,date-format,Javascript,Date,Switch Statement,Date Format,有没有一种方法可以在更少的行上书写,但仍然易于阅读 var month = ''; switch(mm) { case '1': month = 'January'; break; case '2': month = 'February'; break; case '3': month = 'March'; break; case '4': month

有没有一种方法可以在更少的行上书写,但仍然易于阅读

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;
}
试试这个:

var months = {'1': 'January', '2': 'February'}; //etc
var month = months[mm];
请注意,
mm
可以是整数或字符串,它仍然可以工作

如果希望不存在的键导致空字符串
'
(而不是
未定义的
),请添加此行:

month = (month == undefined) ? '' : month;

.

您可以创建一个数组,然后查找月份名称:

var months = ['January','February','March','April','May','June','July','August','September','October','November','December']


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

请参见@CupawnTae的答案,以了解代码背后的理性定义一个数组,然后按索引获取

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

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

您可以使用数组执行此操作:

var months = ['January', 'February', 'March', 'April', 
              'May', 'June', 'July', 'August', 
              'September', 'October', 'November', 'December'];

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

完全不使用数组怎么样:)


根据David Storey的回答,这里有另一个选项,仅使用1个变量,当
mm
超出范围时,仍然应用默认值
'

var-month=['一月'、'二月'、'三月',
“四月”、“五月”、“六月”、“七月”,
‘八月’、‘九月’、‘十月’,
“十一月”、“十二月”
][mm-1]| |“;
小心

第一行应该立即触发警钟:
var month=''-为什么将此变量初始化为空字符串,而不是
null
未定义
?它可能只是一种习惯或复制/粘贴的代码,但除非您确实知道这一点,否则在重构代码时忽略它是不安全的

如果您使用月份名称数组,并将代码更改为
var month=months[mm-1]
您正在更改行为,因为现在对于超出范围的数字或非数值,
月份
未定义
。你可能知道这是可以的,但是在很多情况下这是不好的

例如,假设您的
开关
位于函数
monthName(mm)
中,有人这样调用您的函数:

var monthName = monthToName(mm);

if (monthName === '') {
  alert("Please enter a valid month.");
} else {
  submitMonth(monthName);
}
现在,如果您改为使用数组并返回
monthName[mm-1]
,调用代码将不再按预期运行,并且在应该显示警告时,它将提交
未定义的值。我并不是说这是一个好的代码,但是除非你确切地知道代码是如何使用的,否则你不能做出假设

或者,可能是因为行后面的一些代码假定
month
始终是字符串,并执行类似
month.length
的操作-这将导致在无效月份引发异常,并可能完全终止调用脚本

如果您确实了解整个环境-例如,它都是您自己的代码,没有人会使用它,并且您相信自己不会忘记您在将来某个时候做了更改-这样更改行为可能是安全的,但是有太多的bug来自于这样一种假设,即在现实生活中,你最好进行防御性编程和/或彻底记录行为

正确(编辑:许多其他答案,包括已接受的答案,现在也已修复)-您可以使用
months[mm-1]| |'
,或者如果您希望使发生的事情一目了然,例如:

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

var month;

if (mm >= 1 && m <= 12) {
  month = months[mm - 1];
} else {
  month = ''; // empty string when not a valid month
}
var-months=['一月','二月',…];
var月;

如果(mm>=1&&m为了完整性,我想补充当前的答案。基本上,您可以输入
break
关键字并直接返回适当的值。如果值无法存储在预计算的查找表中,此策略非常有用

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

同样,使用查找表或日期函数更简洁,主观上更好。

您可以使用条件运算符将其编写为表达式而不是开关:

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' :
  '';
如果您以前没有见过链式条件运算符,那么一开始可能会比较难理解。将其作为表达式编写会使一个方面比原始代码更容易理解;很明显,代码的目的是为变量
month

指定一个值,基于前面的答案,我将其缩短为:

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]
}
var months = ['January', 'February', ...];
var month = (mm >= 1 && mm <= 12) ? months[mm - 1] : '';

像@vidriduch一样,我想强调代码i20y(“国际化”)在当今环境中的重要性,并建议以下简洁而健壮的解决方案以及统一测试

函数num2月(月,区域设置){
如果(月!=数学楼层(月)| |月<1 | |月>12)
返回未定义;
var objDate=新日期(数学下限(月)+“/1/1970”);
返回objDate.toLocaleString(区域设置,{month:“long”});
}
/*测试/演示*/
对于(mm=1;mm我会选择的解决方案,但调整如下:

var month = [
    'January',
    'February',
    'March',
    'April',
    'May',
    'June',
    'July',
    'August',
    'September',
    'October',
    'November',
    'December'
][mm-1] || '';

实际上,这是完全相同的代码,但缩进不同,IMO使其更具可读性。

您也可以将
undefined
设置为第一个值(索引0),以便数组索引将匹配月数
var month=month[(mm-1)%12]
@mpez0我想我更愿意知道有人想出了第15个月,而不是隐藏可能不好的东西data@Touffy我想我还是坚持使用
mm-1
,这样
months.length==12
@Touffy我认为这不是品味的问题,而是质量的问题。想象一下你自己在读别人的
[undefined,'一月','二月',…]
-我认为你的第一反应是WTF?!,这通常不是一个好兆头…IMHO是最合适的。这可能不是你的代码中需要日期操作的唯一部分(即使你展示的代码特别容易编码)你应该认真考虑使用现有的、已测试的数据库。我不知道JavaScript,但是它没有哈希图,比如Python字典或C++的STD::MAP?这不是假设的吗?这么多的答案通过不考虑默认值来改变代码的行为,这导致了未定义的输出,这与W不同。原版的帽子
var month = months[mm - 1] || ''; // as mentioned further up
var month = [
    'January',
    'February',
    'March',
    'April',
    'May',
    'June',
    'July',
    'August',
    'September',
    'October',
    'November',
    'December'
][mm-1] || '';