2

私はいくつかの古いコードをクリーンアップしようとしていますが、次のようなものを処理するためのクリーンな1行のソリューションがあるかどうか疑問に思っていました。

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は関数の引数であり、入力が与えられ、配列内にあるという基準を満たしていることを確認するために、いくつかの事前チェックを行いたいと思います。

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

これは一見ばかげているように見えますが、2 つの重要な利点があります。まず、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 に答える