Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

333
Visualizações
Agrupar valores de claves de objetos para obtener una lista de objetos agrupados por una clave

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!

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

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)
about 4 years ago · Juan Pablo Isaza Relatório

0

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; }

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda