簡體   English   中英

檢查參數是否存在並且在數組中,或者設置為默認值

[英]Checking if an argument exists and is in an array, or set to default

我正在嘗試清理一些舊代碼,並且想知道是否存在一種干凈的單行解決方案來處理類似以下內容的問題。

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是函數的參數,我想做一些初步檢查以確保輸入是給定的,並且符合存在於數組中的條件。

您的代碼對我來說很好,除了==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')

您可以使用地圖使存在測試更加容易:

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

// somewhere

format = formats.hasOwnProperty(format) ? format : 'MM/DD/YYYY';

如果可以更改formats數組的內容,例如:

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

然后,您始終可以通過以下方式重寫代碼:

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

但是,如果您不知道是否已定義format變量(作為變量),則最好在進行第一次操作之前添加typeof format !== "undefined"檢查。

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/

請注意,對象屬性的值並不重要,因為我們只是將對象用作列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM