根据上一次结束和下一次开始之间的长度来React Native循环删除次数

n1bvdmb6  于 2023-01-09  发布在  React
关注(0)|答案(1)|浏览(105)

抱歉提前,可能已经看了很长时间。我有一个测试应用程序,显示了一个选定日期的日期和时间的预订预约插槽的水平列表,但似乎不能排除时间,将重叠到其他预约时间。

const updateAvailableTimes = (
            bookings: Array<{stDate: string; enDate: string}>,
            availables: Array<string>,
            currDate: string,
        ) => {
            const newAvailables = [];
            const serviceLengthInMinutes = 90; // 1hr and 30 minutes // Get the actual service length from state or passed param
            for (const ava of availables) {
                const curr = moment(`${currDate} ${ava}`, 'YYYY-MM-DD HH:mm');
                let isBooked = false;
                for (const booking of bookings) {
                    const st = moment(booking.stDate, 'YYYY-MM-DD HH:mm');
                    const en = moment(booking.enDate, 'YYYY-MM-DD HH:mm');

                    if (!curr.isSameOrAfter(st) || !curr.isSameOrAfter(en) && !curr.isBetween(st, en) || curr.isBefore(en)) {
                        if(!curr.isBefore(st) && !curr.isAfter(en)){
                            console.log('Booked Slot: ' + moment(en, 'HH:mm').format('HH:mm'));
                            newAvailables.push('');
                            isBooked = true;
                            break;
                        }
                    }
                }
                if (!isBooked) {
                    console.log('Available Slot: ' + moment(ava, 'HH:mm').format('HH:mm'))
                    newAvailables.push(ava);
                }
            }
            return newAvailables;
        };
    • 示例或应发生的情况**

此选定服务的典型预约时间为1小时30分钟,我已经预订了4个预约,因此我的应用程序应显示以下可供选择的预约时间
[12上午10时、下午16时30分、下午16时45分、下午17时]

    • 所显示的内容是错误的**

[12上午10时、12时15分、12时30分、12时45分、13时、13时15分、13时30分、16时30分、16时45分、17时]
在这种情况下,如果用户能够选择12:30,那么它将与另一个约会时间重叠,因此我需要排除[12:15,12:30 etc ...]

    • 数据**

可用时间:
['09:00',09:15...16:45,17:00]-因此,营业时间为09:00至17:00
选定日期的现有书籍(2022 - 01 - 07):
[统计日期时间:'2023年1月7日09:00',结束日期时间:“二○二三年一月七日十时三十分”]
[统计日期时间:'2023年1月7日10:30',结束日期时间:'2023年1月7日12时'】
[统计日期时间:'2023年1月7日13:30',结束日期时间:'2023年1月7日15时'】
[统计日期时间:'2023年1月7日15:00',结束日期时间:“二○二三年一月七日十六时三十分”]
我实际上认为这是循环中的某个问题,但不确定如何更改数组或数据。

rta7y2nd

rta7y2nd1#

我的错。解决方案是添加一个额外的条件来比较服务年限与上一次约会结束和下一次约会开始之间的时间,或者反之亦然。工作解决方案如下所示:

const updateAvailableTimes = (
            bookings: Array<{stDate: string; enDate: string}>,
            availables: Array<string>,
            currDate: string,
        ) => {
            const newAvailables = [];
            const serviceLengthInMinutesPositive = 90; // FOR TESTING 1hr and 30 minutes // Get the actual service length from state or passed param
            const serviceLengthInMinutesNegative = -90; // FOR TESTING
            for (const ava of availables) {
                const curr = moment(`${currDate} ${ava}`, 'YYYY-MM-DD HH:mm');
                let isBooked = false;
                for (const booking of bookings) {
                    const st = moment(booking.stDate, 'YYYY-MM-DD HH:mm');
                    const en = moment(booking.enDate, 'YYYY-MM-DD HH:mm');
                    let checkForOverlaps = moment.duration(curr.diff(st)).asMinutes();

                    let overlapCondition = Math.abs(checkForOverlaps) <= 89 && Math.abs(checkForOverlaps) >= -89;

                    if (!curr.isSameOrAfter(st) || !curr.isSameOrAfter(en) && !curr.isBetween(st, en) || curr.isBefore(en)) {
                         if(!curr.isBefore(st) && !curr.isAfter(en) || overlapCondition){
                            newAvailables.push('');
                            isBooked = true;
                            break;
                        }
                    }
                }

                if (!isBooked) {
                    newAvailables.push(ava);
                }
            }
            return newAvailables;
        };

因此,如果业务开始时间为07:00,用户尝试预订的特定服务时间长度为1小时30分钟(90分钟),则输出如下所示
[07上午10时、7时15分、7时30分、12时、16时30分......]
"但为什么会是这样“
如果某个企业在09:00安排了一个持续90分钟的预订,而新客户能够预订07:45 - 08:45之间的时间,则该时间将与在09:00预订的约会冲突。因此,如果可用时间设置为[07:00,07:15,07:30],则这些时间将不会与在09:00预订的约会冲突

相关问题