0

我正在用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

我不想写 if 语句的次数与defaultOptions.

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

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

更新:

我从 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];
            }
        }
    }

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

4

2 回答 2

1

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

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

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

于 2013-08-24T14:47:58.433 回答
1
for (option in defaultOptions) {
  if (typeof options[option]=='undefined') options[option] = defaultOptions[option];
}
于 2013-08-24T14:42:46.390 回答