检查参数是否存在并且是否在数组中,或者设置为默认值

时间:2013-01-26 16:55:48

标签: 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)
    format = (typeof format !== 'undefined' && formats.indexOf(format) >= 0) ? format : 'MM/DD/YYYY';

    // ...

format是函数的参数,我想做一些prelim检查以确保输入是给定的,并且符合数组中的条件。

4 个答案:

答案 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';
}

http://jsfiddle.net/6jvVA/

请注意,对象属性的值并不重要,因为我们只是将对象用作列表。