Javascript:创建连续月份的累积对象,然后每年重置



我有一个看起来像这样的数据集:

const data = [
{num: 3, date: 2010-01-01, month: "January", year: 2010}, 
{num: 10, date: 2010-01-02, month: "January", year: 2010}, 
{num: 2, date: 2010-01-03, month: "January", year: 2010},
{num: 0.1, date: 2010-01-04, month: "January", year: 2010},
{num: 0, date: 2010-01-05, month: "January", year: 2010},
{num: 13, date: 2010-02-01, month: "February", year: 2010},
{num: null, date: 2010-02-02, month: "February", year: 2010},
{num: null, date: 2010-02-03, month: "February", year: 2010},
{num: 2, date: 2010-02-04, month: "February", year: 2010},
{num: 3, date: 2010-02-05, month: "February", year: 2010},
{num: 0.1, date: 2010-03-01, month: "March", year: 2010},
{num: 0.002, date: 2010-03-02, month: "March", year: 2010},
{num: 4, date: 2010-03-03, month: "March", year: 2010},
{num: 4.1, date: 2010-03-04, month: "March", year: 2010},
{num: 6, date: 2010-03-05, month: "March", year: 2010},
{num: 6.7, date: 2011-01-01, month: "January", year: 2011}, 
{num: 2, date: 2011-01-02, month: "January", year: 2011}, 
{num: 2.2, date: 2011-01-03, month: "January", year: 2011},
{num: 3, date: 2011-01-04, month: "January", year: 2011},
{num: null, date: 2011-01-05, month: "January", year: 2011},
{num: 0, date: 2011-02-01, month: "February", year: 2011},
{num: 0, date: 2011-02-02, month: "February", year: 2011},
{num: 2.1, date: 2011-02-03, month: "February", year: 2011},
{num: 0, date: 2011-02-04, month: "February", year: 2011},
{num: 0, date: 2011-02-05, month: "February", year: 2011},
{num: null, date: 2011-03-01, month: "March", year: 2011},
{num: 2.1, date: 2011-03-02, month: "March", year: 2011},
{num: 4, date: 2011-03-03, month: "March", year: 2011},
{num: 9, date: 2011-03-04, month: "March", year: 2011},
{num: 7.8, date: 2011-03-05, month: "March", year: 2011},
]

一直到2020年。

我想安排这个数据集,以便它累积到每年年底,并在新的一年开始时再次重置。

所以像这样(如果我的加法算错了,我道歉——只是手工做的):

[
{year: 2010, month: "January", total: 15.1},
{year: 2010, month: "February", total: 33.1}, //15.1+18
{year: 2010, month: "March", total: 47.302}, //15.1+18+14.202
{year: 2011, month: "January", total: 13.9}, // resets -- doesn't cumulate from last year
{year: 2011, month: "February", total: 16 }, // 13.9 + 2.1
{year: 2011, month: "March", total: 38.9}, //13.9 + 2.1 + 22.9
]

我正在学习Javascript中的reduce方法,我试图使用它,但只能完成这样的输出。它很接近,因为它是一个月里天数的总和,但还没有完全达到。如有任何帮助或建议,我将不胜感激。

data.reduce((acc, curr) => {
if (curr.num === null ) return acc
for ( const e of acc) {
if (e.year === curr.year && e.month === curr.month) {
e.totalSum += curr.num
return acc
}
}
const y = {
year: curr.year, 
month: curr.month, 
total: curr.num
}
return state.concat([y])
}, [])

的结果是:

[
{year: 2010, month: "January", total: 15.1},
{year: 2010, month: "February", total: 18}, 
{year: 2010, month: "March", total: 14.202},
{year: 2011, month: "January", total: 13.9},
{year: 2011, month: "February", total: 2.1 },
{year: 2011, month: "March", total: 22.9},
]

同样,这有点接近,但我希望连续的月份累积起来。如有任何帮助或建议,我将不胜感激。

可以简化为:

const data = [
{num: 3, date: 2010-01-01, month: "January", year: 2010},
{num: 10, date: 2010-01-02, month: "January", year: 2010},
{num: 2, date: 2010-01-03, month: "January", year: 2010},
{num: 0.1, date: 2010-01-04, month: "January", year: 2010},
{num: 0, date: 2010-01-05, month: "January", year: 2010},
{num: 13, date: 2010-02-01, month: "February", year: 2010},
{num: null, date: 2010-02-02, month: "February", year: 2010},
{num: null, date: 2010-02-03, month: "February", year: 2010},
{num: 2, date: 2010-02-04, month: "February", year: 2010},
{num: 3, date: 2010-02-05, month: "February", year: 2010},
{num: 0.1, date: 2010-03-01, month: "March", year: 2010},
{num: 0.002, date: 2010-03-02, month: "March", year: 2010},
{num: 4, date: 2010-03-03, month: "March", year: 2010},
{num: 4.1, date: 2010-03-04, month: "March", year: 2010},
{num: 6, date: 2010-03-05, month: "March", year: 2010},
{num: 6.7, date: 2011-01-01, month: "January", year: 2011},
{num: 2, date: 2011-01-02, month: "January", year: 2011},
{num: 2.2, date: 2011-01-03, month: "January", year: 2011},
{num: 3, date: 2011-01-04, month: "January", year: 2011},
{num: null, date: 2011-01-05, month: "January", year: 2011},
{num: 0, date: 2011-02-01, month: "February", year: 2011},
{num: 0, date: 2011-02-02, month: "February", year: 2011},
{num: 2.1, date: 2011-02-03, month: "February", year: 2011},
{num: 0, date: 2011-02-04, month: "February", year: 2011},
{num: 0, date: 2011-02-05, month: "February", year: 2011},
{num: null, date: 2011-03-01, month: "March", year: 2011},
{num: 2.1, date: 2011-03-02, month: "March", year: 2011},
{num: 4, date: 2011-03-03, month: "March", year: 2011},
{num: 9, date: 2011-03-04, month: "March", year: 2011},
{num: 7.8, date: 2011-03-05, month: "March", year: 2011},
];
const res = data.reduce((acc, curr) => {
if (curr.num === null ) return acc
const last = acc[acc.length - 1];
if(last?.month === curr.month){
last.totalSum += curr.num;
return acc;
}
const y = {
year: curr.year,
month: curr.month,
totalSum: curr.num + (curr.year === last?.year ? last.totalSum : 0)
};
return acc.concat([y])
}, []);
console.log(res);

然后只需要初始化y.totalSum

相关内容

最新更新