obj1 = {a:1, b: {b1: 1, b2: 4}}
obj2 = {b: {b1: 2, b3: 3}, c:1 }
console.log(Object.assign(obj1, obj2));
// то что есть --- { a: 1, b: { b1: 2, b3: 3 }, c: 1 }
// то что нужно ---{ a: 1, b: { b1: 2, b2:4, b3: 3 }, c: 1 }
isObject = (item) ->
item and typeof item is 'object' and not Array.isArray item
mergeDeep = (target, source) ->
if isObject(target) and isObject(source)
Object.keys(source).forEach (key) ->
if isObject source[ key ]
if not target[key] then Object.assign target, { "#{key}": {} }
mergeDeep target[ key ], source[ key ]
else
Object.assign target, { "#{key}": source[key] }
target
obj1 = {a:1, b: {b1: 1, b2: 4}}
obj2 = {b: {b1: 2, b3: {b11:4, b21:3}}, c:{c1: {c12: 5} } }
console.log(mergeDeep(obj1, obj2));
###
{ a: 1,
b: { b1: 2, b2: 4, b3: { b11: 4, b21: 3 } },
c: { c1: { c12: 5 } } }
###