Deep Merge Two Hashes (JavaScript) with Answer

Deep Merge Two Hashes (JavaScript)

by dshilkret

HTML

<p>
    Write a method deepMerge(a, b) that takes in 2 hashes and merges all the properties including nested objects and concatenates any array fields:
</p>
<pre></pre>

JavaScript

var a = {"__metadata":{"type":"SP.Data.Data_x0020_SourcesItem"}}
var b = {
   "SNowID2"    : "INC0000001",
   email   : "[email protected]",
   school  : { name: "CS College" },
   grades  : [ 95, 80 ]
}

// deepMerge(a, b) should equal:
var result = {
    "SNowID2"     : "INC0000001",
    "Title"  : "Incident 1"
}

function deepMerge(a,b) {    
    var result = clone(a);

    for(var key in b) {
        if (!result.hasOwnProperty(key)) {
            result[key] = b[key];
        } else if (result[key].constructor === Array && b[key].constructor === Array ) { 
            result[key] = result[key].concat(b[key]); 
        } else if(typeof(result[key]) == 'object' && typeof(b[key]) == 'object') {
            result[key] = deepMerge(result[key], b[key]);
        } else {
            result[key] = b[key];
        }
    }
    
    return result;
}

function clone(obj) {
    var result = obj.constructor();
    
    for(var key in obj) {
        result[key] = obj[key];
    }
    return result;
}

var result = deepMerge(a,b);
console.log(a);
console.log(result);


$('pre').html(JSON.stringify(result));