Este es mi ejemplo:
{ id: 'productId', label: 'productLabel', items: productSizes.map( productSize => { return { id: productSize.groupId, label: productSize.groupId.split('-')[0], items: productSize.size, } }), }Esto daría como resultado algo como esto con nuestros datos:
{ id: 'productId', label: 'productLabel' items: [ {id: 'productA-11', label: 'productA', items: {width: 100, height: 100}}, {id: 'productA-11', label: 'productA', items: {width: 150, height: 150}}, {id: 'productA-11', label: 'productA', items: {width: 200, height: 200}}, {id: 'productB-22', label: 'productB', items: {width: 100, height: 100}}, ] }Pero me gustaría obtener algo como esto:
{ id: 'productId', label: 'productLabel' items: [ {id: 'productA-11', label: 'productA', items: [ {width: 100, height: 100}, {width: 150, height: 150}, {width: 200, height:200}], {id: 'productB-22', label: 'productB', items: [{width: 100, height: 100}], ] } No estoy seguro si describí bien mi problema con palabras, pero me gustaría aplanar de alguna manera los items de propiedad internos, de modo que los tamaños del MISMO productId se fusionen en una sola matriz.
Array.reduce te ayudará
Lógica
items de su objeto.id y labelid y label , empuje el elemento actual a la matriz de items de ese nodo; de lo contrario, inserte un nuevo nodo en el acumulador con id , label y itemsviolín de trabajo
const data = { id: 'productId', label: 'productLabel', items: [ { id: 'productA-11', label: 'productA', items: { width: 100, height: 100 } }, { id: 'productA-11', label: 'productA', items: { width: 150, height: 150 } }, { id: 'productA-11', label: 'productA', items: { width: 200, height: 200 } }, { id: 'productB-22', label: 'productB', items: { width: 100, height: 100 } }, ] }; const { id, label } = data; const items = data.items.reduce((acc, curr) => { const node = acc.find(item => item.id === curr.id && item.label === curr.label); if (node) { node.items.push(curr.items); } else { acc.push({ id: curr.id, label: curr.label, items: [curr.items] }) } return acc; }, []) const output = { id, label, items, } console.log(output);