Javascript 检查参数是否存在且在数组中,或是否设置为默认值
我正在尝试清理一些旧代码,并想知道是否有一个干净的一行解决方案来处理以下内容Javascript 检查参数是否存在且在数组中,或是否设置为默认值,javascript,Javascript,我正在尝试清理一些旧代码,并想知道是否有一个干净的一行解决方案来处理以下内容 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
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检查,以确保输入是给定的,并且符合数组中的条件。您可以使用映射来简化存在性测试:
var formats = {
'DD/MM/YYYY': true,
'MM/DD/YYYY': true
};
// somewhere
format = formats.hasOwnProperty(format) ? format : 'MM/DD/YYYY';
如果可以更改
格式
数组的内容,如:
var formats = ["MM/DD/YYYY", "DD/MM/YYYY"];
然后,您可以始终按照以下方式重写代码:
format = formats[Math.max(0, formats.indexOf(format))];
但是,如果您不知道是否定义了
format
变量(作为变量),则最好添加typeof format!==“未定义”
在第一次使用它进行操作之前检查。我觉得你的代码很好,只是==未定义的检查是多余的
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',
};
乍一看,这看起来很愚蠢,但有两个重要的优点。首先,
中的检查非常简单
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')
将格式
更改为对象,它会变得简单得多:
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';
}
请注意,对象属性的值实际上并不重要,因为我们只是将对象用作列表。应该来自哪里?这是一个功能体吗?如果是,请显示更多代码。您能更改格式
数组的内容吗?您的代码很好,只是==未定义
检查是多余的。@thg435不是,如果根本没有定义格式
,这是很简单的。@thg435如果这是一个函数,并且格式
参数是可选的,这不是多余的。这非常聪明。谢谢。这与@Felix.+1基本相同。在其他答案的基础上,这一个的最终产品是迄今为止最好的选择。我考虑过这两个,但我不想复制值和键的格式。还请注意,formats[format]
对于所有内置属性,例如toString
或valueOf
,都将“失败”。