首页 > 解决方案 > 计算日期的出现次数

问题描述

我有一个包含日期的对象数组。我想计算一个日期在一个月内出现的次数。例如,如果有像 2019-01-14、2019-01-15、2019-01-16 这样的日期,那么 1 月的计数应该是 3。我想每个月都这样做,但不太确定如何在没有的情况下处理它使代码太迟钝。

var jan = 0;
      this.btcDebts.map((item) => {
        let date = new Date(item.date);
          if (date.toString().includes('Jan')){
            jan++;
          }
      })
      console.log(jan);

这行得通,但在另外 11 个月里,它只会变得重复。有没有更简单的方法?

标签: javascript

解决方案


无需将这些字符串字段转换为日期,只需按前 7 个字符分组:

let countBy = (a, fn) => a.map(fn).reduce(
    (m, k) => m.set(k, 1 + (m.get(k) || 0)),
    new Map);

// 

items = [
    {date: '2019-01-14'},
    {date: '2019-02-14'},
    {date: '2019-03-14'},
    {date: '2019-01-14'},
    {date: '2019-02-14'},
    {date: '2019-03-14'},
    {date: '2019-04-14'},
    {date: '2019-05-14'},
    {date: '2019-01-14'},
    {date: '2019-03-14'},
]


counts = countBy(items, item => item.date.slice(0, 7));

for (let [mon, cnt] of counts)
  console.log(mon, cnt)


推荐阅读