Reputation: 2043
I have two js objects
const first = {
obj1: { f11: "v11", f12: "v12" },
obj2: { f21: "v21" }
}
const second = {
obj1: { f11: "new_value" },
obj3: { f: { ff: { fff: "v"} } }
}
How can I update first javascript object only with object2's leaves values and get
const first = {
obj1: { f11: "new_value", f12: "v12" },
obj2: { f21: "v21" },
obj3: { f: { ff: { fff: "v"} } }
}
UPD: I tried Object.assign
but result is
const first = {
obj1: { f11: "new_value" },
obj2: { f21: "v21" },
obj3: { f: { ff: { fff: "v"} } }
}
I loose some of internal fields
Upvotes: 0
Views: 95
Reputation: 386620
You could use a recursive approach by checking the type and assigning new value.
function merge(source, target) {
Object.keys(source).forEach(function (key) {
if (!source[key] && typeof source[key] === 'object') {
target[key] = target[key] || (Array.isArray(source[key]) ? [] : {});
return merge(source[key], target[key]);
}
target[key] = source[key];
});
}
const first = { obj1: { f11: "v11", f12: "v12" }, obj2: { f21: "v21" } },
second = { obj1: { f11: "new_value" }, obj3: { f: { ff: { fff: "v"} } } };
merge(second, first);
console.log(first);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Upvotes: 1
Reputation: 410
This requires deep merge. In jquery you can use $.extend.
Javascript equivalent is:
const first = {
obj1: { f11: "v11", f12: "v12" },
obj2: { f21: "v21" }
}
const second = {
obj1: { f11: "new_value" },
obj3: { f: { ff: { fff: "v"} } }
}
function extend(){
for(var i=1; i<arguments.length; i++)
for(var key in arguments[i])
if(arguments[i].hasOwnProperty(key)) {
if (typeof arguments[0][key] === 'object'
&& typeof arguments[i][key] === 'object')
extend(arguments[0][key], arguments[i][key]);
else
arguments[0][key] = arguments[i][key];
}
return arguments[0];
}
console.log("Merged object is: " + JSON.stringify(extend(first, second)))
Upvotes: 1