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

时间:2015-01-29 11:35:23

标签: javascript jquery

我有一个表单,用户可以在其中添加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);
                }
            });

(serializedToObject只是将表单数据转换为对象)

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

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

1 个答案:

答案 0 :(得分:2)

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

如果我理解正确,data.start.length和data.row.length必须相等,对吧?如果是这样,如果你将s从i-1计数到0,并且误差是(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变量,它只会膨胀!