Skip to content

Instantly share code, notes, and snippets.

@mlconnor
Created August 6, 2014 20:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mlconnor/abe4e6dd9e21f1c68b07 to your computer and use it in GitHub Desktop.
Save mlconnor/abe4e6dd9e21f1c68b07 to your computer and use it in GitHub Desktop.
underscore merge function
var _ = require('lodash');
var obj1 = {foo:'bar',baz:'bang', arr:[1,3,5,7], objecter : { 'connor' : 2, 'sky':'toot', 'new':'dude' } };
var obj2 = {foo:'bar',baz:'bang', arr:[2,4,6,8], newz:1, objecter : { 'sky' : 'mills'} };
merge(obj1,obj2);
merge(null,2);
merge(4,6);
console.log(obj1);
/* object 1 rules */
function merge(obj1, obj2) {
var type1 = getType(obj1);
var type2 = getType(obj2);
if ( type1 !== type2 ) {
return;
}
if ( _.isEqual(obj1,obj2) ) {
return;
}
if ( type1 === 'array' ) {
_.each(obj2, function(obj2item) {
if ( _.indexOf(obj1, obj2item) < 0 ) {
obj1.push(obj2item);
}
});
} else if ( type1 === 'object' ) {
_.each(obj2, function(obj2item, obj2key) {
if ( ! _.has(obj1, obj2key) ) {
obj1[obj2key] = obj2item;
} else {
var merged = merge(obj1[obj2key], obj2item);
}
});
}
}
function getType (val) {
if (typeof val === 'undefined') return 'undefined';
if (typeof val === 'object' && !val) return 'null';
return ({}).toString.call(val).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment