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