按小时时间范围累计记录数:指定日期与预订数据的分组统计需求
实现日期查找与分组的解决方案
没问题,我来帮你搞定这个日期分组的需求!核心思路就是统一日期格式后,把bookings里的条目按sortDates指定的日期归类,下面是一步步的具体实现:
步骤1:统一日期格式
sortDates是DD/MM/YYYY格式,而bookings里的bookingStart是YYYY-MM-DD HH:mm:ss格式,首先得把两者的日期格式对齐,方便匹配。写个简单的转换函数:
function convertToYMD(dateStr) { // 拆分DD/MM/YYYY为日、月、年 const [day, month, year] = dateStr.split('/'); // 拼接成和bookingStart一致的YYYY-MM-DD格式 return `${year}-${month}-${day}`; }
步骤2:初始化分组容器
用Map来创建一个日期到预订列表的映射,确保每个sortDates里的日期都有对应的分组:
const sortDates = [ '14/04/2018', '12/04/2018', '10/04/2018' ]; const bookings = [ { bookingStart: '2018-04-14 00:30:00' }, { bookingStart: '2018-04-14 00:42:00' }, { bookingStart: '2018-04-14 13:35:00' }, { bookingStart: '2018-04-12 12:30:00' }, ]; // 初始化分组Map,每个日期对应空数组 const dateGroups = new Map(); sortDates.forEach(date => { const standardDate = convertToYMD(date); dateGroups.set(standardDate, []); });
步骤3:遍历预订数据完成分组
接下来把每个预订条目放到对应的日期分组里:
bookings.forEach(booking => { // 提取bookingStart里的YYYY-MM-DD日期部分 const bookingDate = booking.bookingStart.split(' ')[0]; // 如果该日期在我们的分组列表中,就添加进去 if (dateGroups.has(bookingDate)) { dateGroups.get(bookingDate).push(booking); } // 可选:如果要处理不在sortDates里的预订日期,可以加这段代码 // else { // if (!dateGroups.has('未指定日期')) dateGroups.set('未指定日期', []); // dateGroups.get('未指定日期').push(booking); // } });
步骤4:按sortDates的顺序输出结果
如果需要保持sortDates的原始顺序输出分组,可以这样处理:
const finalResult = sortDates.map(date => ({ originalDate: date, // 保留你原始的DD/MM/YYYY格式 relatedBookings: dateGroups.get(convertToYMD(date)) })); console.log(finalResult);
运行后会得到这样的结果:
[ { originalDate: '14/04/2018', relatedBookings: [ { bookingStart: '2018-04-14 00:30:00' }, { bookingStart: '2018-04-14 00:42:00' }, { bookingStart: '2018-04-14 13:35:00' } ] }, { originalDate: '12/04/2018', relatedBookings: [ { bookingStart: '2018-04-12 12:30:00' } ] }, { originalDate: '10/04/2018', relatedBookings: [] } ]
这个方案既保证了分组的准确性,又能灵活处理日期格式差异,还能严格遵循你指定的日期顺序~
内容的提问来源于stack exchange,提问作者Raziel
相关产品推荐
相关产品推荐

