检查时间冲突,只想显示 1 个警告

Checking for time conflicts, want to show just 1 warning

本文关键字:警告 显示 只想 时间 冲突 检查      更新时间:2023-09-26

我有一个表单,用户可以在其中添加 X 行,每行都有开始时间和结束时间输入。

行可以根据用户喜欢添加,时间不必按顺序输入,但在提交表单时不得冲突。

到目前为止,我能够检查冲突,使用几个 for 循环并检查每个开始和结束时间与其余时间。

我面临的问题是,很明显,如果第 1 行和第 2 行冲突,我的代码正在记录两个冲突(逻辑上正确!

我只想展示第一个冲突,因为一旦解决了这个问题,自然而然地,第二个冲突就是。

我的代码远:

$('form').submit(function(event){
                event.preventDefault();
                var errors = [];
                var data = serializedToObject($(this).serializeArray());
                for(var i = data.row.length; i--;) {                        
                    for(var s = data.start.length; s--;) {
                        if(s != i) {
                            if(data.start[i] < data.end[s] && data.start[s] < data.end[i]) {
                                errors.push('Conflict between ' + data.row[i] + ' and ' + data.row[s]);
                            }
                        }
                    }
                }
                if(errors.length === 0) {
                    this.submit();
                } else {
                    console.log(errors);
                }
            });

(序列化到对象只是将表单数据转换为对象)

那么如何让我的代码只将 1 个冲突推送到数组呢?

我尝试将行 ID 添加到对象并将其推送到数组中,但它不会记录以后的其他冲突,例如第 1 行与 2 和 4 冲突,1 和 4 之间的冲突不会被提及,因为第 1 行已经在数组中。

我有一个答案给你,但它不是那么有效(再次 O(n^2),正如你在问题中编码的那样)。

如果我理解正确,data.start.length 和 data.row.length 必须相等,对吧?如果是这样,如果你从 i-1 到 0 计算 s,并且错误是 (1,2) 和 (2,1) , (1,2) 不会咳嗽,因为第二个循环从 i-1 开始,在 i=1 的情况下,s 直接从 0 开始。只需看看下面的代码(仅包含for循环):

var length = data.row.length;
for( var i = length; i>0; i-- ) {
    for( var s = i-1; s>0; s-- ) {
        if(data.start[i] < data.end[s] && data.start[s] < data.end[i]) {
         errors.push('Conflict between ' + data.row[i] + ' and ' + data.row[s]);
      }
    }
}

我希望有人会发表评论,提出优化这个想法的想法,如果可能的话,也许是 O(n) :D。但这对你有用,如果你没有length变量那么大100.000,它会膨胀!