如何在javascript函数中轻松覆盖默认选项?

时间:2013-08-24 14:37:09

标签: javascript array-merge

我在javascript中编写以下函数:

Number.prototype.niceFormat(options) {
    var defaultOptions = {
        thousandSeparator: ',',
        leftPad: 0,
        decimalPlaces: 2
    };
    if (typeof options.thousandSeparator != 'undefined'
    && options.thousandSeparator != null) {
        defaultOptions.thousandSeparator = options.thousandSeparator;
    }

}

麻烦的是我希望选项完全灵活。

如果我拨打niceFormat({decimalPlaces: 3}),则相应地替换defaultOptions属性decimalPlaces

我不愿意像defaultOptions中的属性那样多次编写if语句。

是否有一种很好的方法可以灵活地覆盖defaultOptions中的属性值?

基本上我正在为javascript中的对象寻找一种array_merge

更新:

我从Qantas和Crayon和Paul那里得到了答案并写下了这个:

Number.prototype.niceFormat = function(options) {
    var defaultOptions = {
        thousandSeparator: ',',
        leftPad: 0,
        decimalPlaces: 2
    };

    var env = defaultOptions;
    if (typeof options != 'undefined') {
        for (option in env) {
            if (options.hasOwnProperty(option)
            && typeof options[option] != 'undefined') {
                    env[option] = options[option];
            }
        }
    }

无论如何要进一步改善这一点?

2 个答案:

答案 0 :(得分:1)

for (option in defaultOptions) {
  if (typeof options[option]=='undefined') options[option] = defaultOptions[option];
}

答案 1 :(得分:1)

您需要做的是检查两者是否包含该属性,然后分配给它:

for (var i in options) if (options.hasOwnProperty(i) && defaultOptions.hasOwnProperty(i)) defaultOptions[i] = options[i];

hasOwnProperty()检查该属性是否直接在该对象上(而不是通过任何原型或其他东西),并且它实际存在于该对象上。