Как я могу получить массив всех перекрывающихся диапазонов дат в заданном наборе?Javascript

Форум по Javascript
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу получить массив всех перекрывающихся диапазонов дат в заданном наборе?

Сообщение Anonymous »

Я использую JS-библиотеку Fullcalendar.io для визуализации бронирований в моей компании по прокату автомобилей. Я храню мотоциклы в виде массивов категорий (размеров двигателей) с дочерним массивом, содержащим все мотоциклы, принадлежащие каждой из них, как в примере ниже:

Код: Выделить всё

// The resources array contains information about the motorbikes in a rental store.
// The parent array contains the information about the motorbike engine,
// while the children array contains the information about the unique motorbikes belonging to each engine category.
resources = [{
id: "scooter50",
title: "Scooter 50",
children: [{
id: "aa123ab",
title: "AA 123 AB"
},
{
id: "aa456cd",
title: "AA 456 CD"
},
{
id: "aa789ef",
title: "AA 789 EF"
},
{
id: "aa101gh",
title: "AA 101 GH"
}
]
},
{
id: "scooter125",
title: "Scooter 125",
children: [{
id: "bb123ab",
title: "BB 123 AB"
},
{
id: "bb456cd",
title: "BB 456 CD"
},
{
id: "bb789ef",
title: "BB 789 EF"
},
{
id: "bb101gh",
title: "BB 101 GH"
}
]
},
{
id: "scooter250",
title: "Scooter 250",
children: [{
id: "cc123ab",
title: "CC 123 AB"
},
{
id: "cc456cd",
title: "CC 456 CD"
},
{
id: "cc789ef",
title: "CC 789 EF"
},
{
id: "cc101gh",
title: "CC 101 GH"
}
]
}
];
Затем у меня есть несколько событий (бронирований), принадлежащих каждому ресурсу:

Код: Выделить всё

// The events array contains information about the motorbikes that are rented, including the start and end date of the rental.
events = [{
start: new Date(2025, 0, 6, 0, 0),
end: new Date(2025, 0, 9, 23, 59, 59),
resourceId: "bb101gh",
title: "Event 0"
},
{
start: new Date(2025, 0, 11, 0, 0),
end: new Date(2025, 0, 14, 23, 59, 59),
resourceId: "bb101gh",
title: "Event 1"
},
{
start: new Date(2025, 0, 7, 0, 0),
end: new Date(2025, 0, 11, 23, 59, 59),
resourceId: "bb123ab",
title: "Event 2"
},
{
start: new Date(2025, 0, 9, 0, 0),
end: new Date(2025, 0, 14, 23, 59, 59),
resourceId: "bb456cd",
title: "Event 3"
},
{
start: new Date(2025, 0, 7, 0, 0),
end: new Date(2025, 0, 10, 23, 59, 59),
resourceId: "bb789ef",
title: "Event 4"
},
{
start: new Date(2025, 0, 11, 0, 0),
end: new Date(2025, 0, 15, 23, 59, 59),
resourceId: "bb789ef",
title: "Event 5"
},
{
start: new Date(2025, 0, 6, 0, 0),
end: new Date(2025, 0, 15, 23, 59, 59),
resourceId: "cc101gh",
title: "Event 6"
},
{
start: new Date(2025, 0, 8, 0, 0),
end: new Date(2025, 0, 11, 23, 59, 59),
resourceId: "cc123ab",
title: "Event 7"
}
]
События можно визуализировать на этом снимке экрана моей временной шкалы fullcalendar.io.
Всякий раз, когда все мотоциклы в категории полностью забронированы на определенное время slot, я бы хотел иметь красный фон на уровне ресурса (пример здесь). Этого можно легко добиться с помощью фоновых событий (https://fullcalendar.io/docs/background-events). Моя проблема в том, что я не нашел способа надежно и эффективно хранить диапазоны дат, в которых бронирования перекрываются между «n» ресурсами (где «n» — это количество мотоциклов в категории объема двигателя).
На данный момент мне удалось найти полурабочее решение, взяв минимальные и максимальные даты для всех событий, перебрав их с использованием 30-минутных временных интервалов и сохранив фоновое событие для категории движка. когда все его ресурсы зарезервированы по определенному временной интервал. Вот код:

Код: Выделить всё

// Get the minimum and maximum date in the events array
minDate = events.map(event => event.start).reduce((a, b) => a < b ? a : b);
maxDate = events.map(event => event.end).reduce((a, b) => a > b ? a : b);

// Iterate between the dates using 30 minutes intervals.
unavailableDateRanges = [];
for (let i = minDate; i  event.start = i).map(event => event.resourceId);

// If all resources from a certain category are used, store a 30 minutes unavailable range for that category.
let unavailableCategories = resources.filter(resource => resource.children.every(child => usedResources.includes(child.id))).map(resource => resource.id);
for (category of unavailableCategories) {
let start = new Date(i);
let end = new Date(i);
end.setMinutes(end.getMinutes() + 30);
unavailableDateRanges.push({
start: start,
end: end,
resourceId: category,
title: "Unavailable",
display: "background"
});
}
}
Это не дает надежного результата, поскольку проверяется только с 30-минутными интервалами, тогда как бронирование может начаться в другую минуту. Предположим, что бронирование начинается в 9:45, этот код не будет отмечать период с 9:45 до 10:00 как недоступный. Поскольку красный фон будет виден на разных уровнях детализации, это будет проблемой.
Поскольку даты представляют собой непрерывную переменную (UNIX), я думаю, можно было бы отфильтровать события по родительской категории размера двигателя, а затем проверьте, какие диапазоны дат перекрываются для «n» количества мотоциклов, предполагая, что заказы на определенный мотоцикл не перекрываются (в чем я уже убедился). Я пытался написать это решение, но безрезультатно.
Я знаю, что есть некоторые библиотеки для работы с диапазонами дат, например date-fns, но не похоже, что это поможет.< /p>
Может ли кто-нибудь более опытный мне помочь?

Подробнее здесь: https://stackoverflow.com/questions/793 ... -given-set
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Получение списка всех дат в заданном диапазоне дат в JavaScript
    Anonymous » » в форуме Jquery
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Изменить время отсортированного диапазона дат на другой список диапазонов дат в С#
    Anonymous » » в форуме C#
    0 Ответы
    35 Просмотры
    Последнее сообщение Anonymous
  • Эффективно поиск перекрывающихся диапазонов в Python
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Эффективно поиск перекрывающихся диапазонов в Python
    Anonymous » » в форуме Python
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Эффективно поиск перекрывающихся диапазонов в Python
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Javascript»