

新闻资讯
行业动态本文介绍如何高效识别日期数组中存在“同日入住与退房”(即某日期同时作为多个预约的起始或结束日)的场景,并自动将其标记为不可用,适用于酒店、日程等时间资源管理场景。
在日历系统或预订管理中,一个常见但易被忽略的业务规则是:若某一天既是某个预约的结束日(checkout),又是另一个预约的开始日(checkin),则该天通常不可对外开放预订——因为实际运营中需预留清洁/交接时间,不允许“无缝衔接”。例如 2025-07-05 同时出现在 {start: "2025-07-03", end: "2025-07-05"} 的 end 字段和 {start: "2025-07-05", end: "2025-07-08"} 的 start 字段中,此时应将 dates 数组中对应 '2025-07-05' 的条目设为 available: false。
实现这一逻辑的关键在于:识别出在 reserved 预约列表中被重复使用的日期(即至少出现两次)。注意,这里“重复”指该日期作为 start 或 end 值出现 ≥2 次,而非连续或成对出现——无论它是两次 start、两次 end,还是一次 start +
一次 end,只要总频次 ≥2,就触发不可用标记。
以下是清晰、高效的实现方案:
const dates = [
{ date: '2025-07-01', available: true },
{ date: '2025-07-02', available: true },
// ...(其余日期省略,见原始数据)
{ date: '2025-07-31', available: true }
];
const reserved = [
{ start: "2025-07-03", end: "2025-07-05" },
{ start: "2025-07-05", end: "2025-07-08" },
{ start: "2025-07-08", end: "2025-07-10" },
{ start: "2025-07-18", end: "2025-07-20" },
{ start: "2025-07-22", end: "2025-07-24" },
{ start: "2025-07-24", end: "2025-07-26" }
];
// 步骤1:提取所有 start/end 日期到扁平数组
const reservedDatesArr = [];
reserved.forEach(({ start, end }) => {
reservedDatesArr.push(start, end);
});
// 步骤2:标记重复出现的日期为不可用
const finalArr = dates.map(obj => {
const idx = reservedDatesArr.indexOf(obj.date);
const lastIdx = reservedDatesArr.lastIndexOf(obj.date);
if (idx !== -1 && idx !== lastIdx) { // 确保存在且重复
obj.available = false;
}
return obj;
});
console.log(finalArr);
// 输出中:'2025-07-05'、'2025-07-08'、'2025-07-24' 的 available 均为 falseconst countMap = new Map();
reserved.forEach(({ start, end }) => {
countMap.set(start, (countMap.get(start) || 0) + 1);
countMap.set(end, (countMap.get(end) || 0) + 1);
});
const finalArr = dates.map(obj => ({
...obj,
available: (countMap.get(obj.date) || 0) < 2
}));通过该方法,你不仅能精准捕获“同日进出”的冲突点,还能以声明式、易维护的方式集成到现有日历逻辑中,显著提升资源调度的准确性与用户体验。