¿Alguien sabe cómo agrupar una matriz de objetos por una clave de objeto y luego crear una nueva matriz de objetos basada en la agrupación? Por ejemplo, tengo una matriz de objetos Build como se muestra a continuación y quiero agruparlos por productos y crear otro objeto de colores y precio basado en eso.
build = [ { 'Product': 'Cabinets', 'Color': 'Blue', }, { 'Product': 'CounterTop', 'Color': 'White', }, { 'Product': 'Cabinets', 'Color': 'Yellow', }, { 'Product': 'Cabinets', 'Color': 'Yellow', } ]Y lo quiero así
[ { 'Product':'Cabinet', 'color' : { 'Blue','Yellow' } }, { 'Product':'CounterTop', 'color' : { 'White' } } ]Escribí un código para archivarlo, pero no obtengo el resultado esperado.
build.forEach(pr => { if (pr.Product in result) { result[pr['Product']]['Color'] = pr['Color']; } else { result[pr['Product']] = { 'Product': pr['Product'], 'Color': pr['Color'] } } });El código anterior devuelve
[ { 'Product':'Cabinet', 'color' : 'Yellow' }, { 'Product':'CounterTop', 'color' : 'White' } ]Esperar 'color' : { 'Blue','Yellow' } en su salida es incorrecto. Los objetos son pares de datos clave-valor.
En cambio, desea que color sea una matriz. Ajusté tu código:
build.forEach(pr => { if (pr.Product in result) { result[pr['Product']]['Color'].push(pr['Color']); } else { result[pr['Product']] = { 'Product': pr['Product'], 'Color': [pr['Color']] } } }); Ahora piense en cómo puede evitar valores duplicados en la matriz. La respuesta de @ Lissy93 ayuda con eso usando findIndex .
Aquí hay una versión de trabajo. Espero eso ayude :)
const builds = [ { 'Product': 'Cabinets', 'Color': 'Blue' }, { 'Product': 'CounterTop', 'Color': 'White' }, { 'Product': 'Cabinets', 'Color': 'Yellow' }, { 'Product': 'Cabinets', 'Color': 'Yellow' } ]; const results = []; builds.forEach((build) => { const index = results.findIndex((b) => b.Product === build.Product); if (index === -1) { results.push({Product: build.Product, Color: [ build.Color ]}); } else { results[index] = {Product: build.Product, Color: [ ...results[index].Color, build.Color ]} } }); console.log(results); El problema principal en su código fue que está mezclando matrices y pares clave-valor para color . Los KVP se ven como { color: 'red' } , mientras que las matrices serían: [ 'red', 'blue'] .
Usa esta estrategia:
Array#map y Array#filter para crear los datos deseadosVea la demostración a continuación:
const builds = [ { 'Product': 'Cabinets', 'Color': 'Blue' }, { 'Product': 'CounterTop', 'Color': 'White' }, { 'Product': 'Cabinets', 'Color': 'Yellow' }, { 'Product': 'Cabinets', 'Color': 'Yellow' } ], output = [...new Set(builds.map(({Product}) => Product))] .map(Product => ({ Product, Color:builds.filter(({Product:P}) => P === Product) .map(({Color}) => Color) }) ); console.log(output);