You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

代码说明

  1. 效率优化:使用Set存储可用时段,将单次查找操作的时间复杂度从O(n)降至O(1)
  2. 通用转换逻辑:封装时间字符串与总分钟数的转换函数,避免重复代码
  3. 兼容性强:支持任意15分钟倍数的服务时长(15、30、45、60等),无需额外修改即可适配新时长需求
  4. 逻辑严谨:遍历服务时段内的每一个15分钟间隔点,确保所有必要时段均未被预约

内容的提问来源于stack exchange,提问作者carloslopez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:07:51