Actualmente estoy trabajando en un proyecto en el que tengo una serie de objetos, cada uno con "atributo" y "variación".
Necesito agruparlos como un objeto por atributo que tenga el "atributo" y una lista de "variaciones".
Entrada de muestra:
[ { "attribute": "Pack", "variation": "full" }, { "attribute": "Size", "variation": "M" }, { "attribute": "Color", "variation": "blue" }, { "attribute": "Size", "variation": "X" }, { "attribute": "Color", "variation": "red" }, { "attribute": "Pack", "variation": "half" } ]Rendimiento esperado:
[ { "attribute": "Pack", "variations": ["full", "half" ] }, { "attribute": "Size", "variations": ["M", "X"] }, { "attribute": "Color", "variations": ["blue", "red"] }, ]Array#reduce , itere sobre la matriz mientras actualiza un acumulador de objetos donde el atributo es la key y el objeto correspondiente (atributo y variaciones) es el value . En cada iteración, para actualizar las variaciones, debe verificar si ya existe un registro existente para el atributo actual de acc con una lista de variations (puede usar optional-chaining ) y establecer un valor predeterminado de una matriz vacía (usted puede usar nullish-coalescing-operator )Object#values , devuelva la lista de objetos agrupados, cada uno con atributo y variaciones const arr = [ { "attribute": "Pack", "variation": "full" }, { "attribute": "Size", "variation": "M" }, { "attribute": "Color", "variation": "blue" }, { "attribute": "Size", "variation": "X" }, { "attribute": "Color", "variation": "red" }, { "attribute": "Pack", "variation": "half" } ]; const res = Object.values( arr.reduce((acc, { attribute, variation }) => ({ ...acc, [attribute]: { attribute, variations: [...(acc[attribute]?.variations ?? []), variation] } }), {}) ); console.log(res);Puedes probar esto:
let inputObjs = [ { "attribute": "Pack", "variation": "full" }, { "attribute": "Size", "variation": "M" }, { "attribute": "Color", "variation": "blue" }, { "attribute": "Size", "variation": "X" }, { "attribute": "Color", "variation": "red" }, { "attribute": "Pack", "variation": "half" } ]; let grouped = []; let attributeIndex = {}; let groupedIndex = 0; for(k = 0; k < inputObjs.length;k++){ const obj = inputObjs[k]; const attrKey = `_${obj.attribute}`; if(typeof attributeIndex[attrKey] != 'undefined'){ //console.log(grouped[attributeIndex[attrKey]].variations,grouped[attributeIndex[attrKey]].variations.indexOf(obj.variation),obj.variation); if(grouped[attributeIndex[attrKey]].variations.indexOf(obj.variation) == -1){ grouped[attributeIndex[attrKey]].variations.push(obj.variation); } }else{ attributeIndex[attrKey] = groupedIndex; grouped[attributeIndex[attrKey]] = {attribute:obj.attribute,variations:[]}; grouped[attributeIndex[attrKey]].variations.push(obj.variation); groupedIndex += 1; } //console.log(obj); } console.log(grouped); //console.log(attributeIndex);