quiero el resultado a continuación
Dada una matriz
[{ "date": "JAN", "value": 5, "weight": 3 }, { "date": "JAN", "value": 4, "weight": 23 }, { "date": "FEB", "value": 9, "weight": 1 }, { "date": "FEB", "value": 10, "weight": 30 }] y una 'fecha' clave
transformarlo en la siguiente salida:
[{ "date": "JAN", "value": [5, 4], "weight": [3, 23] }, { "date": "FEB", "value": [9, 10], "weight": [1, 30] }]cualquier ayuda sera muy apreciada gracias de antemano
Array#reduce , itere sobre la matriz mientras actualiza un Map donde la primaryKey es la key y el objeto agrupado es el valueObject#entries , obtenga la lista de pares de las propiedadesMap#get , obtenga el valor actual de la clave principal si existeArray#forEach y actualizar las matricesMap#setMap#values , puede obtener la lista de objetos agrupados const transform = (arr, primaryKey) => [... arr.reduce((map, e) => { const { [primaryKey]: key, ...props } = e; const currentProps = Object.entries(props); const item = map.get(key); if(item) { currentProps.forEach(([ k, v ]) => item[k] = [...(item[k] ?? []), v]); } else { const obj = currentProps.reduce((acc, [ k, v ]) => ({ ...acc, [k]: Array.isArray(v) ? [...v] : [v] }), { primaryKey: key }); map.set(key, obj); } return map; }, new Map) .values() ]; console.log( transform([ { "date": "JAN", "value": 5, "weight": 3 }, { "date": "JAN", "value": 4, "weight": 23 }, { "date": "FEB", "value": 9, "weight": 1 }, { "date": "FEB", "value": 10, "weight": 30 } ], 'date') ); console.log( transform([ { type: '200', api: [ '/counter' ] }, { type: '400', api: [ '/counter' ] }, { type: '500', api: [ '/counter', '/product' ] } ], 'type') );