JavaScript中按连续顺序分组数组内工作日元素的方案求助
实现连续工作日按相同营业时间分组
问题分析
原代码用Lodash的groupBy只能将所有营业时间相同的工作日归为一组,但无法区分非连续的同时间工作日(比如示例中的周一/周二与周四,营业时间相同但不连续,需拆分为两组)。要实现需求,需按工作日顺序遍历数组,动态判断当前项与前一项是否满足「连续工作日+相同营业时间」的条件,再进行分组。
实现代码
const array = [ { weekDay: 'Monday', hoursInfo: '11:00am-8:00pm' }, { weekDay: 'Tuesday', hoursInfo: '11:00am-8:00pm' }, { weekDay: 'Wednesday', hoursInfo: '9:00am-11:00am' }, { weekDay: 'Thursday', hoursInfo: '11:00am-8:00pm' }, { weekDay: 'Friday', hoursInfo: '11:00am-9:00pm' }, { weekDay: 'Saturday', hoursInfo: '11:00am-9:00pm' }, { weekDay: 'Sunday', hoursInfo: 'Closed' }, ]; // 定义工作日顺序映射,用于快速判断是否连续 const weekDayOrder = { Monday: 0, Tuesday: 1, Wednesday: 2, Thursday: 3, Friday: 4, Saturday: 5, Sunday: 6 }; // 按连续工作日+相同营业时间分组 const grouped = []; array.forEach(item => { const lastGroup = grouped[grouped.length - 1]; if (lastGroup && lastGroup.hours === item.hoursInfo && weekDayOrder[item.weekDay] === weekDayOrder[lastGroup.days.at(-1)] + 1) { // 满足连续且时间相同,加入当前组 lastGroup.days.push(item.weekDay); } else { // 不满足条件,新建分组 grouped.push({ days: [item.weekDay], hours: item.hoursInfo }); } }); // 转换为期望的字符串格式 const resultStr = grouped.map(group => { const dayRange = group.days.length > 1 ? `${group.days[0]}-${group.days.at(-1)}` : group.days[0]; return `${dayRange}: ${group.hours}`; }).join('\n'); document.getElementById("result").textContent = resultStr;
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script> <div id="result" style="white-space: pre-line;"></div>
关键逻辑说明
- 工作日顺序映射:用对象存储每个工作日的索引值,通过索引差快速判断两个工作日是否连续(当前索引=前一个索引+1)
- 动态分组:遍历数组时,实时检查当前项是否与最后一个分组的营业时间一致,且为连续工作日,满足则合并到当前组,否则新建分组
- 格式转换:将每个分组的工作日数组转换为范围字符串(如
['Monday','Tuesday']转为Monday-Tuesday),最终拼接成目标输出格式
输出效果
Monday-Tuesday: 11:00am-8:00pm Wednesday: 9:00am-11:00am Thursday: 11:00am-8:00pm Friday-Saturday: 11:00am-9:00pm Sunday: Closed
内容的提问来源于stack exchange,提问作者Ragupathy
相关产品推荐
相关产品推荐

