JavaScript如何将hh:mm格式的跨两天小时数组按小时分组
JavaScript按顺序对时间数组按小时分组实现方案
原代码问题排查
你的代码存在三处核心逻辑错误:
- 覆盖了原始时间值,把完整时间字符串替换成了纯小时数值,最终无法输出完整的时间结果
- 判断相等的逻辑错误,没有把前一个元素也做取小时的处理,直接用纯小时和原时间字符串对比,判断逻辑永远不成立
- 没有考虑跨天后小时重复的场景,直接使用普通对象存储会因为键唯一覆盖掉前一天同小时的数据
实现代码
由于你的输入数组本身已经按时间顺序排列,只需要遍历过程中跟踪上一个分组的小时即可实现顺序分组,避免重复键冲突:
var hours = ["22:37", "22:52", "23:07", "23:22", "23:37", "23:52", "0:07", "0:22", "0:37", "0:52", "1:07", "1:22", "1:37", "1:52", "2:07", "2:22", "3:07", "3:22", "4:07", "4:22", "4:37", "4:52", "5:07", "5:22", "6:07", "6:22", "7:07", "7:22", "7:37", "7:52", "8:07", "8:22", "8:37", "8:52", "9:07", "9:22", "9:37", "9:52", "10:07", "10:22", "10:37", "10:52", "11:07", "11:22", "11:37", "11:52", "12:07", "12:22", "14:07", "14:52", "15:07", "15:22", "16:07", "16:22", "16:37", "16:52", "17:07", "17:52", "18:07", "18:22", "18:37", "18:52", "19:07", "19:22", "19:37", "19:52", "20:07", "20:22", "20:37", "20:52", "21:07", "21:22", "21:37", "21:52", "22:07", "22:22", "22:37", "22:52", "23:07", "23:22"] const groupHours = hours.reduce((result, currentTime) => { // 提取当前时间的小时部分 const currentHour = currentTime.split(':')[0] // 取最后一个已存在的分组 const lastGroup = result[result.length - 1] if (lastGroup && Object.keys(lastGroup)[0] === currentHour) { // 小时和上一个分组相同,直接追加当前时间到分组 lastGroup[currentHour].push(currentTime) } else { // 小时不同,新建分组 result.push({ [currentHour]: [currentTime] }) } return result }, []) // 按你需要的格式打印输出 groupHours.forEach(item => { const [hour, timeList] = Object.entries(item)[0] console.log(`${hour}: ${JSON.stringify(timeList)},`) })
输出效果
运行后得到的结果完全符合你的需求,跨天的重复小时会被独立成新分组,不会被覆盖:
22: ["22:37","22:52"], 23: ["23:07","23:22","23:37","23:52"], 0: ["0:07","0:22","0:37","0:52"], 1: ["1:07","1:22","1:37","1:52"], // 中间时段分组省略 21: ["21:07","21:22","21:37","21:52"], 22: ["22:07","22:22","22:37","22:52"], 23: ["23:07","23:22"],
内容的提问来源于stack exchange,提问作者Kobayashi
相关产品推荐
相关产品推荐

