Tengo esta matriz simple, que quiero fusionar el valor de la clave b si la clave a en toda la matriz coincide.
const array = [ {a: 1, b: ['Foo']}, {a: 1, b: ['Bar']}, {a: 1, b: ['Baz']}, {a: 2, b: ['Foo']}, {a: 3, b: ['Foo']}, ]dentro
const array = [ {a: 1, b: ['Foo','Bar','Baz']}, {a: 2, b: ['Foo']}, {a: 3, b: ['Foo']}, ]¿Hay una manera de hacerlo? ¡Cualquier ayuda sería apreciada!
EDIT 1: Lo que me falta aquí es la lógica para tomar todas las claves similares a
Use reduce para iterar sobre la matriz de objetos para crear un objeto donde las claves coincidan con el valor a del objeto, agregando los diversos valores b a sus matrices. Luego use Object.values para crear una nueva matriz.
const arr = [ {a: 1, b: ['Foo']}, {a: 1, b: ['Bar']}, {a: 1, b: ['Baz']}, {a: 2, b: ['Foo']}, {a: 3, b: ['Foo']}, ]; // For each iteration pass in the accumulator // and the current object const out = arr.reduce((acc, c) => { // Assign the value of `a` to `key` const key = ca; // If the key doesn't exist on the accumulator // set a new object acc[key] = acc[key] || { a: key, b: [] }; // And then push the first element of `b` // into the object's array acc[key].b.push(cb[0]); // Return the accumulator return acc; }, {}); // And then finally get the Object.values from // your returned object to make an array console.log(Object.values(out));Puedes usar reduce para eso
Primero creas un objeto con el valor de a como clave y agrupas todos los b con el mismo a
Luego, simplemente elimina las claves de objeto usando Object.values
const array = [ {a: 1, b: ['Foo']}, {a: 1, b: ['Bar']}, {a: 1, b: ['Baz']}, {a: 2, b: ['Foo']}, {a: 3, b: ['Foo']}, ] const grouped = Object.values(array.reduce( (res, {a, b}) => { const existing = res[a] || {b: []} return { ...res, [a]: {a, b: [...existing.b, ...b]} } }, {} )) console.log(grouped)Usando reducir puede fusionar los valores de b y crear una nueva matriz.
const array = [ {a: 1, b: ['Foo']}, {a: 1, b: ['Bar']}, {a: 1, b: ['Baz']}, {a: 2, b: ['Foo']}, {a: 3, b: ['Foo']}, ]; const result = array.reduce((t, { a, b }, _, arr) => { if (t.some(v => va === a)) return t; // if a is already handled, skip return [ ...t, { a, b: arr .filter(v => va === a) // filter out items with different "a" value .reduce((t, v) => [...t, ...vb], []), // merge the values of "b" } ]; }, []); console.log(result);