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