我正在开发资源预订系统,需要有关优化检查资源可用性逻辑的建议。当前的实现可以工作,但感觉效率低下,因为它执行了不必要的检查。
场景如下:
resourceList
中存储了资源列表(例如设备、房间或任何可预订的项目)。bookingList
中。这是我当前的代码:
// Sample resource list
const resourceList = [
{ resourceId: "R1", status: "Available" },
{ resourceId: "R2", status: "Booked" },
{ resourceId: "R3", status: "Booked" }
];
// Sample booking list
const bookingList = [
{ resourceId: "R2", startDate: "2025-01-10", endDate: "2025-01-15" },
{ resourceId: "R2", startDate: "2025-01-20", endDate: "2025-01-25" },
{ resourceId: "R3", startDate: "2025-01-12", endDate: "2025-01-18" }
];
// Requested dates
const startDate = new Date("2025-01-15");
const endDate = new Date("2025-01-19");
let availableResources = [];
let newBookings = [];
const requiredResources = 1; // Example: Only need 1 resource
for (let resource of resourceList) {
if (resource.status === "Booked") {
const resourceBookings = bookingList.filter(
booking => booking.resourceId === resource.resourceId
);
// Check if the resource is available for the requested dates
const isAvailable = resourceBookings.every(booking => {
const existingStart = new Date(booking.startDate);
const existingEnd = new Date(booking.endDate);
return endDate < existingStart || startDate > existingEnd;
});
// Add resource if available and limit not met
if (isAvailable && availableResources.length < requiredResources) {
availableResources.push(resource.resourceId);
newBookings.push({
resourceId: resource.resourceId,
startDate: startDate.toISOString().split("T")[0],
endDate: endDate.toISOString().split("T")[0]
});
}
}
}
如果您解决了类似的问题或有任何想法,我很想听听!
提前感谢您的建议。
关于您提到的两个问题,您都是正确的。 如果保留的预订数量“相当小”,那么像这样检查所有预订可能就可以了。 上下文就是一切。
大规模释放更好性能的关键是使用排序数据。 考虑一下,如果我给了您一排 10,000 张用于预订的索引卡,并且它们按开始日期“排序”。 而且我让你看看2026年6月5日-7日有没有空位。那么只有2个步骤,会非常快:
查找6月5日之前最晚结束的预订如果你能做到这一点,那么确定可用性的算法是:
使用二分查找查找前一个结束的预订
是在排序数据中定位正确位置的最有效方法。 它易于实现,并保证 O(log(n)) 性能。