JavaScript理发店可用时段函数扩展:支持15/30/45/60分钟时长
扩展理发店预约时段筛选函数
原函数说明
原函数getAvailableHours接收理发店可用时段数组hoursArray和服务时长变量minutes,功能是筛选出可预约对应时长服务的起始时段,但仅支持30分钟和60分钟的服务时长。
原示例输入
const hoursArray = [ "09:00", "11:00", "11:30", "12:00", "13:00", "14:00", "14:30", "15:00", "15:30", "16:00", ];
- 当
minutes = 30时,返回:
[ '09:00', '11:00', '11:30', '12:00', '13:00', '14:00', '14:30', '15:00', '15:30', '16:00' ]
注:30分钟服务只需当前时段空闲即可,未出现的时段(如09:30)表示已被预约
- 当
minutes = 60时,返回:
[ '11:00', '11:30', '14:00', '14:30', '15:00', '15:30' ]
原函数实现代码
function getAvailableHours(hours: string[], minutes: number): string[] { const availableHours: string[] = []; for (let i = 0; i < hours.length - 1; i++) { const currentHour = hours[i]; const nextHour = hours[i + 1]; const [hour1, minute1] = currentHour.split(":").map(Number); const [hour2, minute2] = nextHour.split(":").map(Number); const totalMinutes1 = hour1 * 60 + minute1; const totalMinutes2 = hour2 * 60 + minute2; const timeDifference = totalMinutes2 - totalMinutes1; if (minutes === 60) { if (timeDifference >= minutes) { } else { availableHours.push(currentHour); } } if (minutes === 30) { availableHours.push(currentHour); } } if (minutes === 30) { availableHours.push(hours[hours.length - 1]); } return availableHours; }
扩展需求
需要扩展函数,使其支持15分钟、45分钟的服务时长,且hoursArray为15分钟间隔的时段数组(未出现的时段表示已被预约)。
新示例输入
const hoursArray = ["09:00","09:15","09:30","10:00","10:30","10:45","11:00","11:15","11:45","12:15","12:30"]
- 当
duration = 45时,预期返回:
["09:00", "10:30", "10:45"]
- 当
duration = 15时,预期返回原hoursArray - 当
duration = 30时,预期返回:
["09:00", "09:15", "10:30", "10:45", "11:00", "12:15"]
解决方案
核心思路:对每个起始时段,计算服务结束时间,验证从起始时段到结束时间之间的所有15分钟间隔时段是否都在hoursArray中(未出现的时段已被预约)。若全部存在,则该起始时段可用。
实现代码
function getAvailableHours(hours: string[], duration: number): string[] { // 将时段转为Set,提升查找效率 const hourSet = new Set(hours); const available: string[] = []; // 时间字符串转总分钟数 const toTotalMinutes = (time: string): number => { const [h, m] = time.split(':').map(Number); return h * 60 + m; }; // 总分钟数转时间字符串(格式HH:MM) const toTimeString = (totalMinutes: number): string => { const h = Math.floor(totalMinutes / 60).toString().padStart(2, '0'); const m = (totalMinutes % 60).toString().padStart(2, '0'); return `${h}:${m}`; }; for (const startTime of hours) { const startTotal = toTotalMinutes(startTime); const endTotal = startTotal + duration; let isAvailable = true; // 检查服务时长内所有15分钟间隔的时段是否都可用 for (let current = startTotal; current < endTotal; current += 15) { const currentTime = toTimeString(current); if (!hourSet.has(currentTime)) { isAvailable = false; break; } } if (isAvailable) { available.push(startTime); } } return available; }
代码说明
- 效率优化:使用
Set存储可用时段,将单次查找操作的时间复杂度从O(n)降至O(1) - 通用转换逻辑:封装时间字符串与总分钟数的转换函数,避免重复代码
- 兼容性强:支持任意15分钟倍数的服务时长(15、30、45、60等),无需额外修改即可适配新时长需求
- 逻辑严谨:遍历服务时段内的每一个15分钟间隔点,确保所有必要时段均未被预约
内容的提问来源于stack exchange,提问作者carloslopez
相关产品推荐
相关产品推荐

