大量使用Array的reduce系列函数可以让数组的处理过程变得丝滑,方便看也方便改。不知道的朋友们可以在MDN上查(Array - JavaScript | MDN (mozilla.org)
如,要处理以下数据:
// 每个小时吃的饭、水
[
{ date: '2021-07-25', hour: 0, food: 0.5, water: null },
{ date: '2021-07-25', hour: 1, food: 1.5, water: null },
{ date: '2021-07-25', hour: 2, food: 2, water: null },
......
{ date: '2021-07-25', hour: 22, food: 0, water: null },
{ date: '2021-07-25', hour: 23, food: 0, water: null },
{ date: '2021-07-26', hour: 0, food: 0, water: null },
{ date: '2021-07-26', hour: 1, food: 0, water: null },
.......
需求为:把这个家伙每天吃的饭统计出来。
用传统的for一定可以做,但是主要是为了说明这么个情况~ 思路:先聚合每一天,然后进行计算。
JS这里我暂时没用想到办法用map/reduce/flat等方法从一个Array对若干个元素进行分组。如:
上面的变成:
[
[
{ date: '2021-07-25', hour: 0, food: 0.5, water: null }
{ date: '2021-07-25', hour: 1, food: 0.5, water: null }
.....
],
[
{ date: '2021-07-24', hour: 0, food: 0.5, water: null }
{ date: '2021-07-24', hour: 1, food: 0.5, water: null }
.....
],
[
{ date: '2021-07-23', hour: 0, food: 0.5, water: null }
{ date: '2021-07-23', hour: 1, food: 0.5, water: null }
.....
],
.......
]
所以要聚合每一天的话,使用一个新数组吸收老数组。生成数组的开关如上所示,代码如下所示。
const result = Array.apply(null,{
// group_size就是24小时
length:Math.ceil(datas.length/group_size)
}).map(
(item,index)=>{
return datas.slice(index * group_size, (index+1)* group_size);
}
)
之后就是最简单的统计了,只要用flatMap把二维数组拍扁的时候统计就完事了。
result.flatMap(
items => items.reduce(
(accumulator,currentValue)=> accumulator+currentValue.rain
,0
)
)
两段代码连接在一起会更好看一点