4

説明

パラメータが渡される関数がありますoptions。このパラメーターは、オブジェクト配列、または文字列のいずれかです。パラメータが何であるかに応じて、何をすべきかが決まります。


options更新:常に同じ構造のオブジェクトになる必要があることを忘れていました (つまり、常にデフォルト値が設定されている必要があります)。

私はデフォルト値を一度だけ定義したいので、あなたの何人かが提案したように手続き型ifステートメントを使用することは私の好ましい解決策ではありませんが、必要に応じてそれに頼ります.

私はこれをしたくありません(可能であれば):

function foo(options){
    switch(typeof options){
        case 'string':
            // do something etc
        break;  
        // etc
    }
}

パラメータがオブジェクトの場合は、次のように拡張してデフォルトを設定します。

function foo(options){
    // Extend the options to apply default values
    var options = $.extend({
        bar: 'none',
        baz: []
    },options);         
}

パラメータが文字列の場合options.bar、 を文字列と等しくなるように設定し、デフォルト値を拡張します (次のようなもの):

function foo(options){
    // Set the bar property to equal the supplied string
    var options = {
        bar: options    
    };
    // Extend the options to apply default values
    options = $.extend({
        baz: []
    },options);         
}

パラメータが配列の場合、options.bazを配列と等しくなるように設定し、デフォルト値を拡張します (次のようなもの):

function foo(options){
    // Set the baz property to equal the supplied array
    var options = {
        baz: options    
    };
    // Extend the options to apply default values
    options = $.extend({
        bar: 'none'
    },options);         
}

質問

事実上、任意の形式でパラメーターを提供できるようにしたいと考えており、関数はoptions提供されたものから同じオブジェクトを構築します。値が指定されていない場合は、デフォルト値が使用されます。

申し訳ありませんが、これは非常に不明確です。説明するのは非常に困難です。

追加の例

私 (jQuery) が示すことができるもう 1 つの潜在的な方法は、animate()のような関数を見ることです。次のいずれかを指定できることに注意してください。

.animate( properties [, duration] [, easing] [, complete] )

また

.animate( properties, options )

この追加の例は、まさに私が達成したいものではありませんが、正しい方向に沿っています

4

2 に答える 2

3

さまざまな jQuery ヘルパー関数を使用して、次のタイプを判別できますoptions

$.isPlainObject(options)
$.isArray(options)

typeof options === "string"

例えば

function foo(par) {

    // default values
    var options = {
        bar: 'none',
        baz: []
    };

    if ($.isPlainObject(par)) {
        $.extend(options, par);
    } else if ($.isArray(par)) {
        options.baz = par;
    } else if (typeof options === "string") {
        options.bar = par;
    }

    ...
 }

これらの値のいずれかを変更する場合は.slice()、配列のコピーに使用し、ディープ コピー オプションをオンにし$.extend()て、変更が提供されたオブジェクトに影響を与えないようにします。

更新された回答

この特定のケースでは、答えは次のとおりです。

function foo(parameter){
    var options = {
        package:    'none', // Do not load any packages by default
        packageURL: false, // Do not retrieve the package details from a URL by default
        libraries:  [] // Do not load any libraries by default
    };
    // Determine the type of parameter supplied and 
    // build the options accordingly
    if($.isArray(parameter)){
        // Set libraries option
        parameter = {
            libraries: parameter    
        };
    }else if(typeof parameter === "string"){
        // Set package option
        parameter = {
            package: parameter  
        };
    }
    // Extend the parameter object to include the default values
    $.extend(options, parameter);
}
于 2012-11-21T12:30:47.127 に答える
1

を使用typeofして、指定されたパラメーターのタイプを判別できます。
typeof "abc" == "string"; typeof {a:1,b:2} == "object"

これを使用して、実行するコードを決定します(Switch/caseまたはif/else)

于 2012-11-21T12:33:48.383 に答える