JS中使用Array的reduce&map&flat进行实践操作

617 阅读2分钟

大量使用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
        ) 
    )

两段代码连接在一起会更好看一点