I've got an array of dates for the month of July like so:
const dates = [
{ date: '2023-07-01', available: true },
{ date: '2023-07-02', available: true },
{ date: '2023-07-03', available: true },
{ date: '2023-07-04', available: true },
{ date: '2023-07-05', available: true },
{ date: '2023-07-06', available: true },
{ date: '2023-07-07', available: true },
{ date: '2023-07-08', available: true },
{ date: '2023-07-09', available: true },
{ date: '2023-07-10', available: true },
{ date: '2023-07-11', available: true },
{ date: '2023-07-12', available: true },
{ date: '2023-07-13', available: true },
{ date: '2023-07-14', available: true },
{ date: '2023-07-15', available: true },
{ date: '2023-07-16', available: true },
{ date: '2023-07-17', available: true },
{ date: '2023-07-18', available: true },
{ date: '2023-07-19', available: true },
{ date: '2023-07-20', available: true },
{ date: '2023-07-21', available: true },
{ date: '2023-07-22', available: true },
{ date: '2023-07-23', available: true },
{ date: '2023-07-24', available: true },
{ date: '2023-07-25', available: true },
{ date: '2023-07-26', available: true },
{ date: '2023-07-27', available: true },
{ date: '2023-07-28', available: true },
{ date: '2023-07-29', available: true },
{ date: '2023-07-30', available: true },
{ date: '2023-07-31', available: true }
];
There is an end
date of 2023-07-05
in the first element of the array and a start
date in the second element of the array with the same 2023-07-05
date.
This means there is a checkout on the 5th and a checkin on the 5th so I would like to update the dates array above and set available: false
.
I would like to do this anytime I see this pattern of 2 match dates such as the 2023-07-08
.
const reserved = [
{ start: "2023-07-03", end: "2023-07-05" }, // check out 5th
{ start: "2023-07-05", end: "2023-07-08" }, // check in 5th, checkout 8th
{ start: "2023-07-08", end: "2023-07-10" }, // checkin 8th
{ start: "2023-07-18", end: "2023-07-20" }, // checkin 18th, check out 20th - ignore this completely, no overlap
{ start: "2023-07-22", end: "2023-07-24" }, // checkin out 24
{ start: "2023-07-24", end: "2023-07-26" }, // checkin 24
];
Any idea how I can accomplish this? I have tried a numerous amounts of filtering but I can never figure out the right pattern to update where there are 2 on the same day.
You can simply achieve this by using Array.indexOf()
and Array.lastIndexOf()
methods.
Live Demo :
const dates = [
{ date: '2023-07-01', available: true },
{ date: '2023-07-02', available: true },
{ date: '2023-07-03', available: true },
{ date: '2023-07-04', available: true },
{ date: '2023-07-05', available: true },
{ date: '2023-07-06', available: true },
{ date: '2023-07-07', available: true },
{ date: '2023-07-08', available: true },
{ date: '2023-07-09', available: true },
{ date: '2023-07-10', available: true },
{ date: '2023-07-11', available: true },
{ date: '2023-07-12', available: true },
{ date: '2023-07-13', available: true },
{ date: '2023-07-14', available: true },
{ date: '2023-07-15', available: true },
{ date: '2023-07-16', available: true },
{ date: '2023-07-17', available: true },
{ date: '2023-07-18', available: true },
{ date: '2023-07-19', available: true },
{ date: '2023-07-20', available: true },
{ date: '2023-07-21', available: true },
{ date: '2023-07-22', available: true },
{ date: '2023-07-23', available: true },
{ date: '2023-07-24', available: true },
{ date: '2023-07-25', available: true },
{ date: '2023-07-26', available: true },
{ date: '2023-07-27', available: true },
{ date: '2023-07-28', available: true },
{ date: '2023-07-29', available: true },
{ date: '2023-07-30', available: true },
{ date: '2023-07-31', available: true }
];
const reserved = [
{ start: "2023-07-03", end: "2023-07-05" },
{ start: "2023-07-05", end: "2023-07-08" },
{ start: "2023-07-08", end: "2023-07-10" },
{ start: "2023-07-18", end: "2023-07-20" },
{ start: "2023-07-22", end: "2023-07-24" },
{ start: "2023-07-24", end: "2023-07-26" }
];
const reservedDatesArr = [];
reserved.forEach(obj => {
reservedDatesArr.push(obj.start, obj.end)
})
const finalArr = dates.map(obj => {
if (reservedDatesArr.indexOf(obj.date) !== reservedDatesArr.lastIndexOf(obj.date)) {
obj.available = false;
}
return obj;
});
console.log(finalArr);