计算日期的出现

时间:2019-10-20 09:05:10

标签: javascript

我有一个包含日期的对象数组。我想计算一个月中发生日期的次数。例如,如果有类似2019-01-14、2019-01-15、2019-01-16的日期,则一月的计数应为3。我想每个月都这样做,但不太确定如何处理使得代码过于晦涩。

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

这可行,但是在接下来的11个月中,它将变得重复。有没有更简单的方法?

3 个答案:

答案 0 :(得分:2)

无需将这些字符串字段转换为日期,只需按前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)

答案 1 :(得分:1)

您可以使用getMonth()类的Date方法。它从0-11返回几个月。 Documentation Link

var days_in_each_month = [];
this.btcDebts.map((item) => {
    let date = new Date(item.date);
    days_in_each_months[date. getMonth()]++; //month starts from zero. Zero means January.
});
console.log(days_in_each_months);

答案 2 :(得分:1)

也许尝试使用getMonth()获取日期的月份。 (还要记住,它返回的是整数而不是字符串)。如果item.date也可以采用其他格式,请尝试以下代码。

var jan = 0;
var MONTHS = {JAN: 0, FEB: 1, MAR: 2, APR: 3, MAY: 4, JUN: 5, JUL: 6, AUG: 7, SEP: 8, OCT: 9, NOV: 10, DEC: 11};
this.btcDebts.map((item) => {
  let date = new Date(item.date);
  if (date.getMonth() === MONTHS["JAN"]){
    jan++;
  }
})
console.log(jan);

@RobG提到了针对您的情况的最佳解决方案,因为无需创建新的Date对象来解析字符串。请尝试以下代码:-

var jan = 0;
var MONTHS = {JAN: 1, FEB: 2, MAR: 3, APR: 4, MAY: 5, JUN: 6, JUL: 7, AUG: 8, SEP: 9, OCT: 10, NOV: 11, DEC: 12};
this.btcDebts.map((item) => {
  let month = parseInt(item.date.split("-")[1]); // Only works for this format like 2019-01-16
  if (month === MONTHS["JAN"]){
    jan++;
  }
})
console.log(jan);

希望这会有所帮助