Tengo una matriz de objetos y me gustaría agrupar los objetos que tienen el mismo nombre y crear una matriz que contenga los otros valores que difieren. ¿Cómo puedo lograr eso?
const arr = [ { name: 'A', color: 'blue', }, { name: 'A', color: 'purple', }, { name: 'B', color: 'Yellow', }, { name: 'B', color: 'Green', }, ];
Lo que me gustaría conseguir:
const result = [ { name: 'A', color: ['blue', 'purple'], }, { name: 'B', color: ['Yellow', 'Green'], }, ];
Aquí hay una manera de hacerlo:
const arrNames = Array.from(new Set(arr.map((x) => x.name))); // make an array of unique names const result = arrNames .map((x) => arr.filter((y) => y.name === x)) // filter by name .map((x, i) => ({ name: arrNames[i], color: x.map((y) => y.color) })); // make new objects
const found = acc.find(item => item.name === curr.name); if (found) { found.color.push(curr.color); } else { acc.push({ name: curr.name, color: [curr.color], }); } return acc; } , []);
Esto parece algo para lo que se debería usar reduce()
. Use find()
para buscar en el elemento de matriz existente en función de alguna condición. Si el elemento existe, introdúzcalo en la propiedad de colors
del elemento. De lo contrario, inserte en la matriz un nuevo objeto.
const arr = [ { name: 'A', color: 'blue', }, { name: 'A', color: 'purple', }, { name: 'B', color: 'Yellow', }, { name: 'B', color: 'Green', }, ]; let ans = arr.reduce((agg,curr) => { let found = agg.find((x) => x.name === curr.name); if(found){ found.colors.push(curr.color); } else{ agg.push({ name : curr.name, colors : [curr.color] }); } return agg; },[]); console.log(ans);