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

然而,随着选项数量的增加,代码看起来越来越混乱。还有一个潜在的问题是错误/零值被忽略(尽管所有属性当前都是数字且非零)。

有没有更有效、更简洁的方法来实现这一目标?我考虑过在我的函数中创建一个初始化为默认值的对象,然后递归地将参数中提供的任何选项复制给它,但我不确定这样做是否会引入我还没有想到的新问题。

编辑:

我将用来递归复制属性的函数:

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 回答