Tengo un objeto como:
{ "Account Management": [ { "rowId": 1288, "departmentExternalId": "7", "departmentName": "Account Management", "measureName": "Total Headcount Expense", "measureId": 15, "measureValue": 17282, }, { "rowId": 1289, "departmentExternalId": "7", "departmentName": "Account Management", "measureName": "Salary", "measureId": 5, "measureValue": 11666, }, ], "Client Services General (COR)": [ { "rowId": 1294, "departmentExternalId": "114", "departmentName": "Client Services General (COR)", "measureName": "Total Headcount", "measureId": 2, "measureValue": 1, }, { "rowId": 1295, "departmentExternalId": "114", "departmentName": "Client Services General (COR)", "measureName": "Total Headcount", "measureId": 2, "measureValue": 100, } ] }Cada clave de objeto representa el departamento , objeto obtenido después de agrupar los datos obtenidos de BE. Ahora necesito agrupar cada objeto dentro del departamento por ID de medida y contarlos para obtener algo como:
[ {department: "Account Management", measure15: 17282, measure5: 11666}, {department: "Client Services General (COR)", measure2: 101} ]Intenté agrupar los datos agrupados por departamento de nuevo por MeasureId, pero aquí tengo un bloqueador y no sé cómo continuar.
Si alguien tiene alguna idea, por favor dígame.
¡Gracias por adelantado!
La lógica es crear una matriz de objetos que almacenen el
[{measureX: sumOfValuesX}, {measureY: sumOfValuesY, ...}] Para cada id específico del departamento correspondiente. Luego, al desestructurar el objeto y combinarlo con Object.assign() , puede aplanar toda la matriz y tener todos los valores disponibles.
Como se ve en este enfoque con el uso adicional de Object.entries() y reduce() :
let obj={"Account Management":[{rowId:1288,departmentExternalId:"7",departmentName:"Account Management",measureName:"Total Headcount Expense",measureId:15,measureValue:17282},{rowId:1289,departmentExternalId:"7",departmentName:"Account Management",measureName:"Salary",measureId:5,measureValue:11666},],"Client Services General (COR)":[{rowId:1294,departmentExternalId:"114",departmentName:"Client Services General (COR)",measureName:"Total Headcount",measureId:2,measureValue:1},{rowId:1295,departmentExternalId:"114",departmentName:"Client Services General (COR)",measureName:"Total Headcount",measureId:2,measureValue:100}]} output = Object.entries(obj).map(([key, value]) => ({ "department": key, ...Object.assign(...value.reduce((acc, {measureId, measureValue} ) => { let measureIdKey = `measure${measureId}` let currId = acc.filter(x => x[measureIdKey]) return (currId.length ? (currId[0][measureIdKey] += measureValue , acc) : [...acc, { [measureIdKey]: measureValue }]) }, [])) })) console.log(output)En Typescript, tiene algunas modificaciones para seguir la escritura.
type Info = { measureValue: string; measureId: number; } type Foo = { [key: string]: string | number; } type Department = { rowId: number; departmentExternalId: string; departmentName: string; measureName: string; measureValue: number; } | Info let output = Object.entries(obj).map(([key, value]) => ({ "department": key, ...applyReduce(value as Info[]) })) function applyReduce(foo: Info[]) { return foo.reduce((acc: Info[], { measureValue, measureId }: Info): any => { let measureIdKey = `measure${measureId}` let currId: Foo[] = [] // this line is needed to compile acc.forEach(x => currId.push(x)) // this line too currId = currId.filter(x => x[measureIdKey]) return (currId.length ? (currId[0][measureIdKey] += measureValue , acc) : [...acc, { [measureIdKey]: measureValue }]) }, []).reduce((a, c) => ({...a,...c}), {}) // added another reduce } console.log(output)Al usar la función Array.prototype.reduce , podemos crear un objeto con claves iguales a los nombres de departamento, y luego podemos extraer los objetos como una matriz con la función Object.values .
Finalmente, usando la función Array.prototype.flatMap podemos transformar una matriz de matrices en una matriz simple.
const obj = { "Account Management": [{ rowId: 1288, departmentExternalId: "7", departmentName: "Account Management", measureName: "Total Headcount Expense", measureId: 15, measureValue: 17282 }, { rowId: 1289, departmentExternalId: "7", departmentName: "Account Management", measureName: "Salary", measureId: 5, measureValue: 11666 }, ], "Client Services General (COR)": [{ rowId: 1294, departmentExternalId: "114", departmentName: "Client Services General (COR)", measureName: "Total Headcount", measureId: 2, measureValue: 1 }, { rowId: 1295, departmentExternalId: "114", departmentName: "Client Services General (COR)", measureName: "Total Headcount", measureId: 2, measureValue: 100 }]}, output = Object.values(obj).flatMap((array) => { return Object.values(array.reduce((a, d) => { const currentMeasure = a[d.departmentName]?.[`measure${d.measureId}`]; a[d.departmentName] = {...(a[d.departmentName] || {department: d.departmentName}), [`measure${d.measureId}`]: (currentMeasure || 0) + d.measureValue}; return a; }, {})); }); console.log(output); .as-console-wrapper { max-height: 100% !important; top: 0; }