有没有办法在更少的行上写这个,但仍然很容易阅读?
ComboBox select = new ComboBox("Choose car");
container = new BeanItemContainer<Korjaustiedot>(Korjaustiedot.class, korjaukset); // gets the data from my mysql database
select.setContainerDataSource(container); //puts the data from the List <Korjaustiedot> into the container
select.setItemCaptionPropertyId("registernumber"); //chooses the data from the column "registernumber"
this.addComponent(select);
select.addValueChangeListener(event -> // Java 8
this.addComponent(new Label("Selected " +
event.getProperty().getValue())));
// this label only shows: Selected entiteetit.Korjaustiedot@4024af35
答案 0 :(得分:199)
定义一个数组,然后按索引获取。
var months = ['January', 'February', ...];
var month = months[mm - 1] || '';
答案 1 :(得分:81)
根本不使用数组:)
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的回答Get month name from Date
答案 2 :(得分:58)
试试这个:
var months = {'1': 'January', '2': 'February'}; //etc
var month = months[mm];
请注意mm
可以是整数或字符串,它仍然有效。
如果您希望不存在的密钥导致空字符串''
(而不是undefined
),请添加以下行:
month = (month == undefined) ? '' : month;
答案 3 :(得分:26)
您可以改为创建一个数组并查找月份名称:
var months = ['January','February','March','April','May','June','July','August','September','October','November','December']
var month = months[mm-1] || '';
请参阅@CupawnTae的答案,了解代码|| ''
答案 4 :(得分:19)
小心!
应立即触发警钟的事情是第一行:var month = '';
- 为什么此变量被初始化为空字符串,而不是null
或undefined
?它可能只是习惯或复制/粘贴代码,但除非您确切知道,否则在您重构代码时忽略它是不安全的。
如果您使用月份名称数组并将代码更改为var month = months[mm-1];
,则表示您正在更改行为,因为现在对于超出范围的数字或非数字值,month
将为{{ 1}}。你可能知道这没关系,但是在很多情况下这都不好。
例如,假设您的undefined
位于函数switch
中,有人正在调用您的函数:
monthToName(mm)
现在,如果您更改为使用数组并返回var monthName = monthToName(mm);
if (monthName === '') {
alert("Please enter a valid month.");
} else {
submitMonth(monthName);
}
,则调用代码将不再按预期运行,并且当它应显示警告时它将提交monthName[mm-1]
值。我不是说这是好的代码,但除非您确切知道代码的使用方式,否则您无法做出假设。
或者可能原始初始化是因为那里的某些代码假设undefined
将始终是一个字符串,并执行month
之类的操作 - 这将导致抛出异常无效几个月,并可能完全杀死调用脚本。
如果你做知道整个背景 - 例如这是你自己的所有代码,没有其他人会使用它,和你相信自己不会忘记你在未来的某个时候做出了改变 - 改变这样的行为可能是安全的但是,很多错误来自于这种假设,即在现实生活中,你在防御性编程和/或彻底记录行为方面要好得多。
Wasmoo's answer正确(编辑:其他一些答案,包括已接受的答案,现已修复) - 您可以使用month.length
或者如果您我希望一眼就能看出发生的事情,比如:
months[mm-1] || ''
答案 5 :(得分:17)
为了完整性,我想补充目前的答案。基本上,您可以省略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 '';
}
再一次,使用查找表或日期函数更简洁,主观更好。
答案 6 :(得分:16)
您可以使用数组执行此操作:
var months = ['January', 'February', 'March', 'April',
'May', 'June', 'July', 'August',
'September', 'October', 'November', 'December'];
var month = months[mm - 1] || '';
答案 7 :(得分:12)
这是另一个仅使用1个变量的选项,当mm
超出范围时,仍会应用默认值var month = ['January', 'February', 'March',
'April', 'May', 'June', 'July',
'August', 'September', 'October',
'November', 'December'
][mm-1] || '';
。
{{1}}
答案 8 :(得分:9)
您可以使用条件运算符将其写为表达式而不是开关:
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
赋值。
答案 9 :(得分:6)
在Cupawn Tae's回答之前,我将其缩短为:
var months = ['January', 'February', ...];
var month = (mm >= 1 && mm <= 12) ? months[mm - 1] : '';
或者,是的,我欣赏,不太可读:
var month = months[mm - 1] || ''; // as mentioned further up
答案 10 :(得分:4)
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]
}
答案 11 :(得分:4)
与@vidriduch一样,我想强调i20y(“国际化”)代码在当今环境中的重要性,并提出以下简洁而强大的解决方案以及单一测试。
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/>"));
我尽量保持与原始问题尽可能接近,即将数字1到12转换为月份名称,不仅针对一个特殊情况,而且如果参数无效则返回undefined
,使用一些以前增加了批评和其他答案的内容。
(从undefined
到''
的更改非常简单,以防完全匹配。)
答案 12 :(得分:0)
我选择the manual的解决方案,但请按照以下方式进行调整:
var month = [
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
][mm-1] || '';
它是完全相同的代码,但实际上却有不同的缩进,IMO使其更具可读性。