如何根据array2开闭时间区间分组passArray并统计数量?
按开闭时间区间分组并统计Pass数量
问题描述
从API获取了两个数组:
passArray(记录Pass信息)
const passArray = [ {pass_id: 645, heure_debut: '13:48:00', heure_fin: '14:48:00', createdAt:"2023-08-03T13:48:00.000Z"}, {pass_id: 646, heure_debut: '14:40:00', heure_fin: '15:40:00', createdAt:"2023-08-03T14:40:00.000Z"}, {pass_id: 647, heure_debut: '20:30:00', heure_fin: '21:30:00', createdAt:"2023-08-04T20:30:00.000Z"}, {pass_id: 648, heure_debut: '13:00:00', heure_fin: '14:00:00', createdAt:"2023-08-04T13:00:00.000Z"}, {pass_id: 649, heure_debut: '16:25:00', heure_fin: '17:25:00', createdAt:"2023-08-05T16:25:00.000Z"}, {pass_id: 650, heure_debut: '18:30:00', heure_fin: '19:30:00', createdAt:"2023-08-05T18:30:00.000Z"} ];
array2(记录开闭时间)
const array2 = [ {horaire_id: 5, operation: 'opened', user_id: 1, createdAt: '2023-08-03T12:15:46.000Z'}, {horaire_id: 7, operation: 'closed', user_id: 1, createdAt: '2023-08-04T12:21:29.000Z'}, {horaire_id: 8, operation: 'opened', user_id: 1, createdAt: '2023-08-04T12:29:04.000Z'}, {horaire_id: 9, operation: 'closed', user_id: 1, createdAt: '2023-08-05T07:57:16.000Z'}, {horaire_id: 10, operation: 'opened',user_id: 1, createdAt: '2023-08-05T08:04:48.000Z'}, {horaire_id: 11, operation: 'closed',user_id: 1, createdAt: '2023-08-06T03:06:56.000Z'} ];
需求:根据array2中operation为opened和closed的时间区间,对passArray按createdAt分组,最终统计每个区间内的Pass数量。期望分组结果示例:
2023-08-03T12:15:46.000Z : {pass_id: 645, heure_debut: '13:48:00', heure_fin: '14:48:00', createdAt:"2023-08-03T13:48:00.000Z"} {pass_id: 646, heure_debut: '14:40:00', heure_fin: '15:40:00', createdAt:"2023-08-03T14:40:00.000Z"}, 2023-08-04T12:29:04.000Z: {pass_id: 647, heure_debut: '20:30:00', heure_fin: '21:30:00', createdAt:"2023-08-04T20:30:00.000Z"} {pass_id: 648, heure_debut: '13:00:00', heure_fin: '14:00:00', createdAt:"2023-08-04T13:00:00.000Z"} 2023-08-05T07:57:16.000Z: {pass_id: 649, heure_debut: '16:25:00', heure_fin: '17:25:00', createdAt:"2023-08-05T16:25:00.000Z"} {pass_id: 650, heure_debut: '18:30:00', heure_fin: '19:30:00', createdAt:"2023-08-05T18:30:00.000Z"}
解决方案
步骤说明
- 整理开闭时间区间:从
array2中提取成对的opened和closed时间,形成明确的时间区间数组。 - 分组Pass数据:使用
reduce遍历passArray,将每个Pass匹配到对应的时间区间中。 - 统计数量:基于分组结果,直接获取每个区间内的Pass数量。
代码实现
// 1. 整理开闭时间区间 const intervals = []; let currentOpened = null; for (const item of array2) { if (item.operation === 'opened') { currentOpened = item.createdAt; } else if (item.operation === 'closed' && currentOpened) { intervals.push({ start: currentOpened, end: item.createdAt }); currentOpened = null; } } // 2. 分组Pass并统计数量 const result = passArray.reduce((acc, pass) => { const passTime = new Date(pass.createdAt); // 找到当前Pass所属的时间区间 const interval = intervals.find(iv => { const start = new Date(iv.start); const end = new Date(iv.end); return passTime >= start && passTime <= end; }); if (interval) { const key = interval.start; if (!acc[key]) { acc[key] = { passes: [], count: 0 }; } acc[key].passes.push(pass); acc[key].count += 1; } return acc; }, {}); // 输出分组及统计结果 console.log('分组结果:'); for (const key in result) { console.log(`${key} :`); result[key].passes.forEach(p => console.log(p)); console.log(`数量:${result[key].count}\n`); }
代码解释
- 整理区间:遍历
array2,将连续的opened和closed时间配对成区间,确保每个区间有清晰的开始和结束节点。 - reduce分组:
reduce是分组统计的最优选择,它能高效累积结果。对每个Pass,用find匹配对应的时间区间,然后将Pass加入该区间的数组并更新计数。 - 结果输出:最终
result对象的键为区间的opened时间,对应值包含该区间内的所有Pass数据和统计数量。
内容的提问来源于stack exchange,提问作者ivory uchiwa
相关产品推荐
相关产品推荐

