Tengo dos matrices de objetos como este:
const oldArr = [ { 'Tomorrow': [{ id: 2 }, { id: 4 }, { id: 3 }] }, { 'Saturday': [{ id: 2 }, { id: 4 }, { id: 3 }] } ] const newArr = [ { 'Monday': [{ id: 2 },{ id: 4},{ id: 3 }] }, { 'Tomorrow': [{ id: 1 },{ id: 5 }]} ]Quiero fusionar ambos sin claves duplicadas, por lo que debería dar como resultado:
[ { 'Tomorrow': [{ id: 2 }, { id: 4 }, { id: 3 }, { id: 1 }, { id: 5 }] }, { 'Saturday': [{ id: 2 }, { id: 4 }, { id: 3 }] }, { 'Monday': [{ id: 2 }, { id: 4 }, { id: 3 }] } ] Como puede ver, los contenidos de Tomorrow se han agregado al Tomorrow original, y se ha agregado el objeto Monday .
He descubierto vagamente cómo hacerlo con bucles anidados, pero supongo que hay una solución más simple usando map , reduce o similar.
Esto se puede lograr fácilmente con una combinación de la ordenada sintaxis de distribución de javascript, las funciones de prototipo de Array y Object, y los patrones de desestructuración.
[...oldArr, ...newArr].flatMap(Object.entries).reduce( (acc, [k, v]) => ({ ...acc, [k]: [...acc[k]||[], ...v] }), {})¡Tan simple como esto!
const oldArr = [ {'Tomorrow': [{'id':2},{'id':4},{'id':3}]}, {'Saturday': [{'id':2},{'id':4},{'id':3}]} ] const newArr = [ {'Monday': [{'id':2},{'id':4},{'id': 3}]}, {'Tomorrow': [{'id':1},{'id':5}]} ] const result = [...oldArr, ...newArr].flatMap(Object.entries).reduce( (acc, [k, v]) => ({ ...acc, [k]: [...acc[k]||[], ...v] }), {}) console.log(result)Para obtener una explicación muy detallada de cómo funciona esto, consulte esta respuesta ampliada a una pregunta similar. La diferencia en esa otra pregunta es que allí, cada objeto interno tenía solo un objeto como valor, en lugar de una matriz.
Esto se puede lograr iterando las matrices combinadas para generar un objeto con todos los valores para cada clave en las matrices; luego usando Object.entries para mapear eso de nuevo al formato original:
const oldArr = [ {'Tomorrow': [{'id':2},{'id':4},{'id':3}]}, {'Saturday': [{'id':2},{'id':4},{'id':3}]} ] const newArr = [ {'Monday': [{'id':2},{'id':4},{'id': 3}]}, {'Tomorrow': [{'id':1},{'id':5}]} ] const result = Object.entries(oldArr.concat(newArr) .reduce((a, o) => { let k = Object.keys(o)[0] a[k] = (a[k] || []).concat(o[k]) return a }, {}) ).map(([k, v]) => ({ [k] : v})) console.log(result)