如何合并2个javascript对象,如果它们不存在于另一个中,则将属性填充到一个中?

Gle*_*ven 20 javascript arrays merge

如果我有一个javascript对象/ assoc.数组定义如下:

function somefunction(options) {

    var defaults = {
        prop1: 'foo',
        prop2: 'bar'
    };

    //Do stuff here

}
Run Code Online (Sandbox Code Playgroud)

我想用它作为函数的默认值.因此,当函数被调用时,我想用options变量填充变量in defaults,但前提是它们不存在options.

所以我们可以说这是被称为

somefunction({ prop1: 'fish' });
Run Code Online (Sandbox Code Playgroud)

如何才能使它optionsdefaults我合并,以便我得到它

{
    prop1: 'fish',
    prop2: 'bar'
}
Run Code Online (Sandbox Code Playgroud)

TML*_*TML 42

重新阅读问题后,我意识到你可能正在寻找更像这样的东西:

var a = { 'foo': 'bar', 'baz': 'bat' };
var b = { 'foo': 'quux' };
for (var prop in a) {
    if (prop in b) { continue; }
    b[prop] = a[prop];
}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢,这应该是接受的答案:) (3认同)

cgp*_*cgp 12

您可以查看jQuery或Prototypes 扩展功能.

它看起来像这样:(直接取自jQuery)

jQuery.extend = jQuery.fn.extend = function() {
    // copy reference to target object
    var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;

    // Handle a deep copy situation
    if ( typeof target === "boolean" ) {
        deep = target;
        target = arguments[1] || {};
        // skip the boolean and the target
        i = 2;
    }

    // Handle case when target is a string or something (possible in deep copy)
    if ( typeof target !== "object" && !jQuery.isFunction(target) )
        target = {};

    // extend jQuery itself if only one argument is passed
    if ( length == i ) {
        target = this;
        --i;
    }

    for ( ; i < length; i++ )
        // Only deal with non-null/undefined values
        if ( (options = arguments[ i ]) != null )
            // Extend the base object
            for ( var name in options ) {
                var src = target[ name ], copy = options[ name ];

                // Prevent never-ending loop
                if ( target === copy )
                    continue;

                // Recurse if we're merging object values
                if ( deep && copy && typeof copy === "object" && !copy.nodeType )
                    target[ name ] = jQuery.extend( deep, 
                        // Never move original objects, clone them
                        src || ( copy.length != null ? [ ] : { } )
                    , copy );

                // Don't bring in undefined values
                else if ( copy !== undefined )
                    target[ name ] = copy;

            }

    // Return the modified object
    return target;
};
Run Code Online (Sandbox Code Playgroud)

  • 这不是你需要编写的代码,这就是扩展函数的样子,我所要做的就是options = $ .extend(defaults,options) (6认同)
  • 我意识到他正在分享一个jQuery方法 - 但它执行了很多处理以执行'深层复制',其中OP使它看起来比这更简单.请记住一些事情. (4认同)
  • 我想覆盖Flot选项(深度超过一个级别),我需要深层复制,所以我很高兴有人提到它. (2认同)