Эта демонстрация имеет class
с несколькими методами, которые используют ES6 Map для хранения диапазонов дат.Каждая инструкция представляет график сотрудника.В OP не упоминалось, что делать с перекрывающимися датами, поэтому вот правила проверки диапазона дат:
Даты для сравнения преобразуются в миллисекунды (.getTime()
)
Если начальная дата больше другой начальной даты и меньше ее конечной даты, то используется самая ранняя начальная дата, и тогда новая конечная дата будет больше двух из двух конечных дат.
Если дата начала ввода больше даты окончания ввода, они меняются местами.
Каждый диапазон сохраняется индексом.
Кстати, даты точные, но формат меняется, я оставлю это доОП.
class schedule {
constructor(id) {
this.id = id;
this.index = 0;
this.map = new Map;
}
addSlot([startString, endString]) {
this.index = this.map.size;
let startDate = new Date(startString);
let endDate = new Date(endString);
let startTime = startDate.getTime();
let endTime = endDate.getTime()
if (startTime > endTime) {
let temp = endDate;
endDate = startDate;
startDate = temp;
}
if (this.map.size > 0) {
for (let [key, value] of this.map) {
let start = value[0].getTime();
let end = value[1].getTime();
let newStart = startTime > start && startTime < end ? value[0] : start > startTime && start < endTime ? startDate : false;
let newEnd;
if (newStart) {
newEnd = end > endTime ? value[1] : endDate;
this.map.set(key, [newStart, newEnd]);
} else {
this.map.set(this.index, [startDate, endDate]);
}
}
} else {
this.map.set(this.index, [startDate, endDate]);
}
}
hasSlot(index) {
return this.map.has(index);
}
getSlot(index) {
return this.map.get(index);
}
viewSlots() {
let list = '';
for (let [key, value] of this.map) {
list += `
${key}: [Start: ${value[0]} -
End: ${value[1]}]
`;
}
return list;
}
removeSlot(index) {
if (this.map.has(index)) {
this.map.delete(index);
} else {
return index + 'does not exist';
}
}
}
const m = new schedule('Mate');
console.log(m.id);
m.addSlot(['04/19/2019', '04/28/2019']);
console.log(m.hasSlot(0));
m.addSlot(['04/21/2019', '05/12/2019']);
console.log(m.hasSlot(1));
console.log(m.getSlot(0));
m.addSlot(['08/19/2019', '09/12/2019']);
console.log(m.hasSlot(1));
console.log(m.getSlot(1));
console.log(m.viewSlots());