如何缩短切换大小写区块转换为月份名称?
有没有办法在less数几行上写这个,但仍然易于阅读?
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 = ['January', 'February', ...]; var month = months[mm - 1] || '';
怎么样不使用数组:)
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" }));
根据这个答案从David Storey的date获取月份名称
尝试这个:
var months = {'1': 'January', '2': 'February'}; //etc var month = months[mm];
请注意, mm
可以是整数或string,它仍然可以工作。
如果你想让不存在的键导致空string''
(而不是undefined
),那么添加下面这行:
month = (month == undefined) ? '' : month;
JSFiddle 。
您可以创build一个数组,并查找月份名称:
var months = ['January','February','March','April','May','June','July','August','September','October','November','December'] var month = months[mm-1] || '';
查看@CupawnTae对于代码|| ''
后面的理由的回答 || ''
小心!
应该立即触发警钟的事情是第一行: var month = '';
– 为什么这个variables被初始化为一个空string,而不是null
或undefined
? 它可能只是习惯或复制/粘贴的代码,但是除非您确实知道,重构代码时忽略它是不安全的。
如果使用月份名称数组并将代码更改为var month = months[mm-1];
您正在更改行为,因为现在对于范围之外的数字或非数字值, month
将是undefined
。 你可能知道这是好的,但是在很多情况下,这是不好的。
例如,假设您的switch
处于函数monthToName(mm)
,并且有人正在像这样调用您的函数:
var monthName = monthToName(mm); if (monthName === '') { alert("Please enter a valid month."); } else { submitMonth(monthName); }
现在,如果您更改为使用数组并返回monthName[mm-1]
,则调用代码将不再按预期运行,并且应该在显示警告时提交undefined
值。 我并不是说这是很好的代码,但除非你确切地知道代码是如何被使用的,否则你不能做出假设。
或者,也许最初的初始化是在那里,因为一些代码进一步假定该month
将始终是一个string,并做一些像month.length
– 这将导致在无效月份引发exception,并可能完全杀死调用脚本。
如果你知道整个上下文 – 例如它是你自己的代码,没有其他人会使用它,你相信自己不会忘记你将来会做出改变 – 改变行为可能是安全的像这样,但是很多错误都来自于这样一种假设,即在现实生活中,你可以更好地进行防御性编程和/或彻底logging行为。
Wasmoo的回答是正确的(编辑:其他一些答案,包括接受的答案,现在已经修复了) – 你可以使用months[mm-1] || ''
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 }
为了完整性,我想补充当前的答案。 基本上,你可以省略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 ''; }
再次使用查找表或date函数更简洁和主观上更好 。
你可以用数组来做到这一点:
var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; var month = months[mm - 1] || '';
这是另一个只使用1个variables的选项,当mm
超出范围时仍然应用默认值''
。
var month = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ][mm-1] || '';
您可以使用条件运算符将其写成expression式而不是开关:
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' : '';
如果你还没有看到链接的条件运算符,在这之前可能看起来更难看。 把它写成一个expression式使得一个方面比原始代码更容易被看到; 很明显,代码的意图是为variablesmonth
分配一个值。
build立在Cupawn Tae的回答之前我会缩短到:
var months = ['January', 'February', ...]; var month = (mm >= 1 && mm <= 12) ? months[mm - 1] : '';
另外,是的,我明白,不太可读:
var month = months[mm - 1] || ''; // as mentioned further up
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] }
像@vidriduch一样,我想强调一下当今代码中i20y(“国际化”)代码的重要性,并提出以下简洁和强大的解决scheme以及单一testing。
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/>"));
我会去找wasmoo的解决scheme,但是像这样调整它:
var month = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ][mm-1] || '';
这是完全相同的代码,真的,但不同的缩进,这使得IMO更具可读性。