Tengo un objeto javascript personalizado similar a este:
const my_obj = { 'foo1': { 'bar1': '1', 'bar2': '2', 'bar3': '3', }, 'foo1': { 'bar4': '4', 'bar5': '5', }, 'foo2': { 'bar1': '1', 'bar2': '2', } }y quiero fusionar elementos con la misma clave, por lo que en este caso el objeto se convertiría en:
const my_obj = { 'foo1': { 'bar1': '1', 'bar2': '2', 'bar3': '3', 'bar4': '4', 'bar5': '5', }, 'foo2': { 'bar1': '1', 'bar2': '2', } }¿Hay alguna manera de hacer esto fácilmente?
Si intenta definir un objeto con claves en conflicto, el primero se reemplaza por el segundo (al menos en mis intentos).
Teniendo en cuenta que tiene dos objetos con las mismas claves, puede hacer dos tipos de combinación: superficial o profunda.
Si una fusión superficial es suficiente, puede usar Object.assign para hacer el trabajo como el siguiente, pero iterando para cada clave:
obj3.foo1 = Object.assign({}, obj1.foo1, obj2.foo1);Para copias superficiales, tenga en cuenta que las referencias se mantienen ya que
Object.assignsolo copia los valores como se explica en la documentación, lo que puede ser un problema para los objetos anidados.
Pero si necesita una fusión profunda, sería un poco más complicado. Supongo que la forma más fácil es usar una biblioteca como deepmerge-json :
const result = merge(obj1, obj2)Esto hará una fusión profunda entre los dos objetos creando un tercero sin referencia a los originales.
La ventaja de este enfoque es que los objetos se fusionarán sin importar cuántos niveles tengan.