var a = {
1: {
687: {
name:'test1'
}
}
}
var b = {
1: {
689: {
name:'test2'
}
}
}
var c = {
...a,
...b
}
console.log(c)
I was expecting the result to be :
{
1: {
687: {
name:'test1'
},
689: {
name:'test2'
}
}
}
But, it is :
{
1: {
689: {
name:'test2'
}
}
}
Am I using spread operator wrong? What is the most efficient way to merge two objects? I made a function which iterates through each key in the objects, it works but I think it's not the write way.
Object.assign({},a,b)
also returns the same (first result, which I don't want).
I went through the question How can I merge properties of two JavaScript objects dynamically?
But It doesn't answer my question. this answer (https://stackoverflow.com/a/171256/1352853) is also not what I want.
Thanks in advance.
To merge objects into a new one that has all properties of the merged objects, you have two options: Use a spread operator ( ... ) Use the Object. assign() method.
To merge two objects in JavaScript, you can use the spread ... operator. The spread operator creates a new object with all the properties from the first and second object. If there's two properties with the same name, the property from the second object wins out.
Example 2: Merge Property of Two Objects Using Spread Operator. In the above example, two objects are merged together using the spread operator ... . Note: In both the above examples, if the two objects have the same key, then the second object's key overwrites the first object's key.
lodash merge actually does what I exactly need.
https://blog.mariusschulz.com/2015/03/30/combining-settings-objects-with-lodash-assign-or-merge
// Defined within your component
var defaultSettings = {
strictMode: true,
formatting: {
finalNewline: true,
quotes: "double"
}
};
// Provided by the developer using your component
var userSettings = {
formatting: {
quotes: "single"
}
};
var assignedSettings = _.assign({}, defaultSettings, userSettings);
// {
// strictMode: true,
// formatting: {
// quotes: "single"
// }
// }
var mergedSettings = _.merge({}, defaultSettings, userSettings);
// {
// strictMode: true,
// formatting: {
// finalNewline: true,
// quotes: "single"
// }
// }
The spread operator is for arrays and iterable objects.
If x = ['A','B','C'];
Then ...x
is equals to writing x[0], x[1], x[2]
.
You want to merge the nested objects key by key from each object, not replace the previous values.
let key;
let c = {};
for (key in a) {
c[key] = Object.assign({}, a[key]);
}
for (key in b) {
c[key] = Object.assign(c[key] || {}, b[key]);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With