我有一个包含日期的对象数组。我想计算一个月中发生日期的次数。例如,如果有类似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个月中,它将变得重复。有没有更简单的方法?
答案 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);
希望这会有所帮助