2

我正在尝试清理一些旧代码,并且想知道是否有一个干净的单行解决方案来处理类似以下内容。

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';

    // ...

格式是一个函数的参数,我想做一些初步检查以确保输入是给定的,并且符合在数组中的标准。

4

4 回答 4

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')
于 2013-01-26T17:10:44.127 回答
1

您可以使用地图使存在测试更容易一些:

var formats = {
    'DD/MM/YYYY': true,
    'MM/DD/YYYY': true
};

// somewhere

format = formats.hasOwnProperty(format) ? format : 'MM/DD/YYYY';
于 2013-01-26T17:00:45.137 回答
1

如果您可以更改formats数组的内容,例如:

var formats = ["MM/DD/YYYY", "DD/MM/YYYY"];

然后你总是可以通过以下方式重写你的代码:

format = formats[Math.max(0, formats.indexOf(format))];

但是,如果您不知道是否format定义了变量(作为变量),最好typeof format !== "undefined"在第一次操作之前添加检查。

于 2013-01-26T17:03:27.380 回答
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/

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

于 2013-01-26T17:12:49.643 回答