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

124
Visualizações
Creando una matriz de objetos con suma acumulativa en javascript

Tengo esta matriz original que necesito transformar en la que se llama original.

 const data = [ { end_date: "2020-01-31" invoices_count: 22 month: "2020-01" start_date: "2020-01-01" total_margin: 1000 total_revenue: 1000 }, { end_date: "2020-02-29" invoices_count: 14 month: "2020-02" start_date: "2020-02-01" total_margin: 2000 total_revenue: 2000 }]

necesito acumular el margen_total y el ingreso_total a lo largo del tiempo, de modo que el resultado sea igual al mes anterior + el valor del mes actual, por lo que la matriz resultante se verá así:

 const result = [ { end_date: "2020-01-31" invoices_count: 22 month: "2020-01" start_date: "2020-01-01" total_margin: 1000 total_revenue: 1000 }, { end_date: "2020-02-29" invoices_count: 14 month: "2020-02" start_date: "2020-02-01" total_margin: 3000 total_revenue: 3000 }]

Escribí esta función para hacer esto, pero también está modificando el primer valor en la matriz (total_margin & total_margin en el índice 0), y los números realmente no suman el valor correcto, no estoy seguro de lo que estoy haciendo equivocado

 export const getCumulativeValueMonth = (data: MonthlyRevenue[]): MonthlyRevenue[] => { const orderedData = _.orderBy(data, (o) => Date.parse(o.start_date), ['asc']); const accumulated = orderedData.map((x, i) => ({ start_date: x.start_date, end_date: x.end_date, invoices_count: x.invoices_count, month: x.month, total_margin: data .slice(0, i + 1) .map(({ total_margin }) => total_margin) .reduce((z, y) => z + y), total_revenue: data .slice(0, i + 1) .map(({ total_revenue }) => total_revenue) .reduce((z, y) => z + y), })); return accumulated; };

¿Alguna idea de lo que hice mal?

¡Gracias!

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

0

Está cortando los data de la matriz original, pero necesita tomar los accumulated ordenados.


Para un enfoque más corto, puede cerrar las sumas acumulativas deseadas y agregar los valores y devolver un nuevo objeto.

 const original = [{ end_date: "2020-01-31", invoices_count: 22, month: "2020-01", start_date: "2020-01-01", total_margin: 1000, total_revenue: 1000 }, { end_date: "2020-02-29", invoices_count: 14, month: "2020-02", start_date: "2020-02-01", total_margin: 2000, total_revenue: 2000 }], result = original.map(((total_margin, total_revenue) => o => { total_margin += o.total_margin; total_revenue += o.total_revenue; return { ...o, total_margin, total_revenue }; })(0, 0)); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

Con llaves diferentes.

 const original = [{ end_date: "2020-01-31", invoices_count: 22, month: "2020-01", start_date: "2020-01-01", total_margin: 1000, total_revenue: 1000 }, { end_date: "2020-02-29", invoices_count: 14, month: "2020-02", start_date: "2020-02-01", total_margin: 2000, total_revenue: 2000 }], result = original.map(((margin, revenue) => ({ total_margin, total_revenue, ...o }) => { margin += total_margin; revenue += total_revenue; return { ...o, margin, revenue }; } )(0, 0) ); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

about 4 years ago · Juan Pablo Isaza Relatório

0

res = data.reduce((acc, it) => { if (acc.length > 0) { let last = acc[acc.length-1]; acc.push({...it, total_margin: it.total_margin + last.total_margin, total_revenue: it.total_revenue + last.total_revenue}); } else { acc.push(it); } return acc; }, []);
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