我正在尝试清理一些旧代码,并且想知道是否有一个干净的单行解决方案来处理类似下面的内容。
function dates(format) {
var formats = ['DD/MM/YYYY','MM/DD/YYYY'];
// is there a one liner for something like this? If format is undefined this will throw an error when evaluating formats.indexOf(format)
format = (typeof format !== 'undefined' && formats.indexOf(format) >= 0) ? format : 'MM/DD/YYYY';
// ...
format是函数的参数,我想做一些prelim检查以确保输入是给定的,并且符合数组中的条件。
答案 0 :(得分:3)
您的代码对我来说很好,除了==undefined
检查是多余的。
function dates(format) {
var formats = ['DD/MM/YYYY','MM/DD/YYYY'];
format = formats.indexOf(format) >= 0 ? format : 'MM/DD/YYYY';
}
请注意,如果您根本没有参数调用dates()
,这将不抛出异常。
如果您有很多这样的代码,您可以考虑使用像
这样的实用程序函数function oneOf(item /*, args */) {
args = [].slice.call(arguments, 1)
return args.indexOf(item) >= 0 ? item : args[0];
}
然后:
function dates(format) {
format = oneOf(format, 'MM/DD/YYYY', 'DD/MM/YYYY')
}
如果您决定使用Felix建议的对象,最好像这样构建它:
var formats = {
'DD/MM/YYYY': 'DD/MM/YYYY',
'MM/DD/YYYY': 'MM/DD/YYYY',
};
乍一看这看起来很愚蠢,但有两个重要的优点。首先,in
检查就像一样简单
format = formats[format] || 'DD/MM/YYYY'
第二,您可以扩展它以为您的值提供别名:
var formats = {
'DD/MM/YYYY': 'DD/MM/YYYY',
'MM/DD/YYYY': 'MM/DD/YYYY',
'english': 'M/D/YYYY'
'german': 'DD.MM.YYYY'
};
dates('german')
答案 1 :(得分:1)
您可以使用地图使存在测试更容易一些:
var formats = {
'DD/MM/YYYY': true,
'MM/DD/YYYY': true
};
// somewhere
format = formats.hasOwnProperty(format) ? format : 'MM/DD/YYYY';
答案 2 :(得分:1)
如果您可以更改formats
数组的内容,例如:
var formats = ["MM/DD/YYYY", "DD/MM/YYYY"];
然后您可以按以下方式重写代码:
format = formats[Math.max(0, formats.indexOf(format))];
但是,如果您不知道是否定义了format
变量(作为变量),那么在第一次操作之前添加typeof format !== "undefined"
检查总是好的。
答案 3 :(得分:0)
将formats
更改为对象,它变得更加简单:
function dates(format) {
// value does not matter
var formats = {'DD/MM/YYYY': 0, 'MM/DD/YYYY': 0 };
format = format in formats ? format : 'MM/DD/YYYY';
}
请注意,对象属性的值并不重要,因为我们只是将对象用作列表。