Object.assign—override nested property
Here's a small function called Object_assign
(just replace the .
with a _
if you need nested assigning)
The function sets all target values by either pasting the source value in there directly, or by recursively calling Object_assign
again when both the target value and source value are non-null
objects.
const target = {
a: { x: 0 },
b: { y: { m: 0, n: 1 } },
c: { z: { i: 0, j: 1 } },
d: null
}
const source1 = {
a: {},
b: { y: { n: 0 } },
e: null
}
const source2 = {
c: { z: { k: 2 } },
d: {}
}
function Object_assign (target, ...sources) {
sources.forEach(source => {
Object.keys(source).forEach(key => {
const s_val = source[key]
const t_val = target[key]
target[key] = t_val && s_val && typeof t_val === 'object' && typeof s_val === 'object'
? Object_assign(t_val, s_val)
: s_val
})
})
return target
}
console.log(Object_assign(Object.create(target), source1, source2))
After some trying I could find a solution that looks pretty nice like that:
const b = Object.assign({}, a, {
user: {
...a.user,
groups: 'some changed value'
}
});
To make that answer more complete here a tiny note:
const b = Object.assign({}, a)
is essentially the same as:
const b = { ...a }
since it just copies all the properties of a
(...a
) to a new Object. So the above can written as:
const b = {
...a, //copy everything from a
user: { //override the user property
...a.user, //same sane: copy the everything from a.user
groups: 'some changes value' //override a.user.group
}
}