How can I merge 2 javascript objects, populating the properties in one if they don't exist in the other? How can I merge 2 javascript objects, populating the properties in one if they don't exist in the other? arrays arrays

How can I merge 2 javascript objects, populating the properties in one if they don't exist in the other?


After re-reading the question, I realized you're probably looking for something more like this:

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


You could look at either jQuery's or Prototypes extend functionality.

It looks like this: (taken directly from 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;};


I'm a PrototypeJS holdout. Us Java-types prefer PrototypeJS's OO design over jQuery. Here's how you merge two Object/Hash/Maps with Proto:

$H(obj1).merge(obj2).toObject()

The input obj1 and obj2 are unaffected. obj2 map entries have precedence (i.e. obj1 and obj2 both have same key, the value for that key in obj2 will override).