Estoy trabajando con una matriz en la que estoy tratando de obtener la suma total por día y luego devolver una matriz con tales resultados. Mi enfoque hasta ahora es incorrecto ya que NaN después de aplicar la suma. Estoy en un callejón sin salida y no estoy seguro de por qué. Puedo aplicar una lógica similar si quisiera obtener la suma total de todos los días, pero esto no funciona para la suma de cada día. ¿Cuál sería el enfoque correcto para lograr el siguiente resultado?
Formación
var test = [{ statistics: [{ "date": "03-13-2022", "balance": 19.88, }, { "date": "03-13-2022", "balance": 12.99, }, { "date": "03-14-2022", "balance": 17.97, }, { "date": "03-14-2022", "balance": 19.64, }]}]; Actualmente esto está devolviendo NaN por la suma:
let balance = []; for (let s = 0; s < test[0].statistics.length; s++) { console.log(test[0].statistics[s].date); balance[`${test[0].statistics[s].date}`] += test[0].statistics[s].balance; } //Returns : //[ '03-13-2022': NaN, '03-14-2022': NaN ]Esto devuelve la suma total :/. quiero la suma total por dia
let balance2 = 0; for (let s = 0; s < test[0].statistics.length; s++) { console.log(test[0].statistics[s].date); balance2 += test[0].statistics[s].balance2; } //70.48Resultado deseado:
[ { date: '03-13-2022', balance: 32.87 }, { date: '03-14-2022', balance: 37.61 } ]Debe establecer el valor predeterminado 0 para balance[test[0].statistics[s].date] si no está definido.
Porque un valor indefinido + un número = NaN
if (!balance[test[0].statistics[s].date]) { balance[test[0].statistics[s].date] = 0 } var test = [{ statistics: [{ "date": "03-13-2022", "balance": 19.88, }, { "date": "03-13-2022", "balance": 12.99, }, { "date": "03-14-2022", "balance": 17.97, }, { "date": "03-14-2022", "balance": 19.64, } ] }]; let balance = {}; for (let s = 0; s < test[0].statistics.length; s++) { if (!balance[test[0].statistics[s].date]) { balance[test[0].statistics[s].date] = 0 } balance[test[0].statistics[s].date] += test[0].statistics[s].balance; } console.log(balance)Aquí están mis códigos que devuelven lo mismo que el resultado deseado,
var test = [{ statistics: [{ "date": "03-13-2022", "balance": 19.88, }, { "date": "03-13-2022", "balance": 12.99, }, { "date": "03-14-2022", "balance": 17.97, }, { "date": "03-14-2022", "balance": 19.64, }]}]; // Grouping all data according to respective dates const returnGroupedData = (arr)=>{ const data = {}; arr.forEach((ar) => { data[ar.date] = [...(data[ar.date] || []), {date: ar.date, balance: ar.balance}] }); return data; }; //Returning the sum const returnTheSum =(obj)=>{ return Object.keys(obj).map(item=>{ let balances = [...obj[item].map(arr=>arr.balance)] let sum = balances.reduce((total, num)=>{ return total + num }) return {date: item, balance: sum} }) } console.log(returnTheSum(returnGroupedData(test[0].statistics)));Puede usar Array#reduce() especialmente si tiene saldos para varias fechas en las que la salida es un objeto con las fechas como claves y los saldos totales como valores.
const test = [{ statistics: [{"date": "03-13-2022","balance": 19.88},{"date": "03-13-2022","balance": 12.99},{"date": "03-14-2022","balance": 17.97},{"date": "03-14-2022","balance": 19.64},{"date": "03-14-2022","balance": 29.88},{"date": "03-14-2022","balance": 6.99},{"date": "03-15-2022","balance": 1.97},{"date": "03-15-2022","balance": 39.64}]}]; const totals = test[0].statistics.reduce( (prev, {date,balance}) => ({...prev,[date]:(prev[date] || 0) + balance}), {} ); console.log( totals ); /* OUTPUT { "03-13-2022": 32.87, "03-14-2022": 74.47999999999999, "03-15-2022": 41.61 } */ //To convert to your desired output use: const desired = Object.entries( totals ).map( ([date,balance]) => ({date,balance}) ); console.log( desired ); /* OUTPUT [ { "date": "03-13-2022", "balance": 32.87 }, { "date": "03-14-2022", "balance": 74.47999999999999 }, { "date": "03-15-2022", "balance": 41.61 } ] */