0

複数のオプションを含むオプションのオブジェクトで呼び出すことができる関数があり、省略した場合はそれぞれデフォルト値にフォールバックする必要があります。

私は現在これを次のようにやっています:

function f(options){
    var _options = options || {};
    _options.propertyOne = options.propertyOne || 50;
    _options.propertyTwo = options.propertyOne || 100;
    _options.propertyThree = options.propertyThree || {};
    _options.propertyThree.subPropOne = options.propertyThree.subPropOne || 150;

    //etc...
}

var options = {
    propertyOne: 20,
    propertyThree: {
        subPropOne: 100
    }
}

f(options);

ただし、オプションの数が増えるにつれて、コードはますます乱雑に見えます。また、false/ゼロの値が無視されるという潜在的な問題もあります (ただし、現在、すべてのプロパティは数値であり、ゼロではありません)。

これを達成するためのより効果的でより簡潔な方法はありますか? 関数内でデフォルト値に初期化されたオブジェクトを作成し、引数で指定されたオプションを再帰的にコピーすることを検討しましたが、そうすると、まだ考えていない新しい問題が発生する可能性があるかどうかわかりません。

編集:

プロパティを再帰的にコピーするために使用する関数:

function copyOptions(from, to){
    for(var i in from){
        if(typeof from[i] == "object"){
            to[i] = copyOptions(from[i], to[i]);
        }else if(typeof from[i] != "undefined"){
            to[i] = from[i];
        }
    }
}
4

1 に答える 1

1

以下を試してみてください。

function f(options){
    var _options = {
        propertyOne: 50,
        propertyTwo = 100,
        propertyThree: {
            subPropOne: 150
        }
    }

    if(options !== undefined){
        for(i in options){
            _options[i] = options[i];
        }
    }
}

次に、関数内で変数_optionsを使用します。typeof options [i]がオブジェクトであるかどうかを確認するためにループも拡張してから、それにステップインする必要があります。

于 2012-05-30T09:56:50.887 に答える