Я работаю с массивом, который пытаюсь получить общую сумму за день, а затем возвращаю массив с такими результатами. Мой подход пока неверен, так как я получаю NaN
после применения суммы. Я в тупике и не знаю, почему. Я могу применить аналогичную логику, если хочу получить общую сумму всех дней, но это не работает для суммы каждого дня. Каким будет правильный подход для достижения приведенного ниже результата?
Множество
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,
}]}];
В настоящее время это возвращает NaN
на сумму:
let balance = [];
for (let s = 0; s < test[0].statistics.length; s++) {
console.info(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 ]
Это возвращает общую сумму :/. Я хочу общую сумму в день
let balance2 = 0;
for (let s = 0; s < test[0].statistics.length; s++) {
console.info(test[0].statistics[s].date);
balance2 += test[0].statistics[s].balance2;
}
//70.48
Желаемый результат:
[
{
date: '03-13-2022',
balance: 32.87
},
{
date: '03-14-2022',
balance: 37.61
}
]
Вам нужно установить значение по умолчанию 0 для balance[test[0].statistics[s].date]
, если оно не определено.
Потому что неопределенное значение + число = 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.info(balance)
Вот мои коды, возвращающие то же самое, что и желаемый результат,
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.info(returnTheSum(returnGroupedData(test[0].statistics)));
Вы можете использовать Array#reduce()
, особенно если у вас есть балансы на несколько дат, в которых выходные данные представляют собой объект с датами в качестве ключей и общими балансами в качестве значений.
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.info( 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.info( desired );
/* OUTPUT
[
{
"date": "03-13-2022",
"balance": 32.87
},
{
"date": "03-14-2022",
"balance": 74.47999999999999
},
{
"date": "03-15-2022",
"balance": 41.61
}
]
*/
Гений! Вот такой подход мне был нужен.