Question:
I am working with a database of jobs that are recorded daily, and I need to summarize the information grouping by company and obtain the progress sum of each task.
An example of the logs:
let trabajos = [{
faena: 'Mantención AAVC',
avance: 235,
medida: 'Metros',
empresa: 'Empresa Uno'
},
{
faena: 'Mantención AAVC',
avance: 125,
medida: 'Metros',
empresa: 'Empresa Uno'
},
{
faena: 'Mantención AAVC',
avance: 100,
medida: 'Metros',
empresa: 'Empresa Dos'
},
{
faena: 'Mantención Caminos',
avance: 2,
medida: 'Km',
empresa: 'Empresa Dos'
},
{
faena: 'Poda',
avance: 600,
medida: 'Metros',
empresa: 'Empresa Dos'
}]
What I am looking for as results would be something like this:
resumen = [{
empresa: 'Empresa Uno',
trabajos: [
{
faena: 'Mantención AAVC',
avance: 360,
medida: 'Metros',
}
]
},
{
empresa: 'Empresa Dos',
trabajos: [
{
faena: 'Mantención AAVC',
avance: 100,
medida: 'Metros'
},
{
faena: 'Mantención Caminos',
avance: 2,
medida: 'Km'
},
{
faena: 'Poda',
avance: 600,
medida: 'Metros'
}
]
}]
I tried with reduce () and filter () but I get an arrangement with the different companies and a list of jobs from it, and I got tangled in how I can summarize the information to obtain each task with the sum of them by company.
const resp = trabajos.reduce((arrayTrabajo, trabajo) => {
const found = arrayTrabajo.find(a => a.empresa === trabajo.empresa);
const value = trabajo;
if (!found) {
arrayTrabajo.push({ empresa: trabajo.empresa, trabajos: [value] });
}
else {
found.trabajos.push(value);
}
return arrayTrabajo; }, []); console.log(resp);
Thanks!
Answer:
With reduce()
and find()
you can do it.
You need to first find the company in the accumulator, if it exists, then you have to find the job in the job list of that company, and then add the advance there.
If there is no job, then you have to add a new job to the company's job list.
If the company does not exist, then you have to create the company with a job listing with the new job.
const trabajos = [{ faena: 'Mantención AAVC', avance: 235, medida: 'Metros', empresa: 'Empresa Uno' }, { faena: 'Mantención AAVC', avance: 125, medida: 'Metros', empresa: 'Empresa Uno' }, { faena: 'Mantención AAVC', avance: 100, medida: 'Metros', empresa: 'Empresa Dos' }, { faena: 'Mantención Caminos', avance: 2, medida: 'Km', empresa: 'Empresa Dos' }, { faena: 'Poda', avance: 600, medida: 'Metros', empresa: 'Empresa Dos' }]; const resumen = trabajos.reduce((acumulador, trabajo) => { // Recuperar la empresa del acumulador. const empresaEnAcumulador = acumulador.find(({ empresa }) => empresa === trabajo.empresa); if (empresaEnAcumulador) { // Recuperar la faena de la empresa del acumulador. const faenaEnEmpresa = empresaEnAcumulador.trabajos.find(({ faena }) => faena === trabajo.faena); if (faenaEnEmpresa) { // Añadir el avance a la faena de la empresa del acumulador. faenaEnEmpresa.avance += trabajo.avance; } else { // La faena no existe en la empresa del acumulador, la añadimos. const nuevoTrabajo = { faena: trabajo.faena, avance: trabajo.avance, medida: trabajo.medida }; empresaEnAcumulador.trabajos.push(nuevoTrabajo); } } else { // La empresa no existe en el acumulador, así que la añadimos. acumulador.push({ empresa: trabajo.empresa, trabajos: [ { faena: trabajo.faena, avance: trabajo.avance, medida: trabajo.medida } ]}); } return acumulador; }, []); console.log(resumen);