Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查参数是否存在且在数组中,或是否设置为默认值_Javascript - Fatal编程技术网

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
,都将“失败”。