如何按日期、月份、年份统计Economy预订记录的数量
按时间维度统计Economy预订记录的函数实现
需求说明
已有一个统计Booked为Economy的总记录数的statusCounter函数,现在需要实现一个支持按年份、月份、日期三个维度分别统计该类型记录数量的函数。
示例数据
// data.js [ { _id: "1", Name: "John", Booked: "Executive", date: "2023-03-02T18:15:26.723+00:00" }, { _id: "2", Name: "Peter", Booked: "Economy", date: "2023-03-19T19:15:26.723+00:00" }, { _id: "3", Name: "Wade", Booked: "Economy", date: "2024-04-19T19:15:26.723+00:00" }, { _id: "4", Name: "Mary", Booked: "Economy", date: "2024-04-20T19:15:26.723+00:00" } ]
原有统计函数
// countfunction.js statusCounter(inputs) { let counter = 0; for (const input of inputs) { if (input.Booked === 'Economy') counter += 1; } return counter; }
实现方案
我们可以编写一个新函数statusCounterByTime,通过指定时间维度参数,完成分维度统计:
function statusCounterByTime(inputs, timeDimension = 'date') { // 先过滤出所有Booked为Economy的记录 const economyRecords = inputs.filter(item => item.Booked === 'Economy'); // 初始化统计结果对象 const countResult = {}; economyRecords.forEach(record => { const date = new Date(record.date); let timeKey; // 根据指定维度生成对应的时间键 switch(timeDimension) { case 'year': timeKey = date.getFullYear().toString(); break; case 'month': // 月份从0开始,需+1,统一格式为YYYY-MM timeKey = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`; break; case 'date': default: // 日期格式统一为YYYY-MM-DD timeKey = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`; } // 更新统计计数 countResult[timeKey] = (countResult[timeKey] || 0) + 1; }); return countResult; }
函数说明
- 参数说明:
inputs:待统计的原始数据数组timeDimension:可选参数,支持'year'(按年)、'month'(按月)、'date'(按日),默认值为'date'
- 逻辑步骤:
- 先过滤出所有
Booked为Economy的记录,减少后续遍历的数量 - 根据指定维度生成标准化的时间键,避免格式不一致导致统计错误
- 使用对象存储每个时间维度对应的计数,遍历更新数值
- 先过滤出所有
示例用法
// 按年份统计 console.log(statusCounterByTime(data, 'year')); // 输出:{ '2023': 1, '2024': 2 } // 按月份统计 console.log(statusCounterByTime(data, 'month')); // 输出:{ '2023-03': 1, '2024-04': 2 } // 按日期统计 console.log(statusCounterByTime(data)); // 输出:{ '2023-03-19': 1, '2024-04-19': 1, '2024-04-20': 1 }
内容的提问来源于stack exchange,提问作者user20183888
相关产品推荐
相关产品推荐

