【问题标题】:Checking for time conflicts, want to show just 1 warning检查时间冲突,只想显示 1 个警告
【发布时间】:2015-01-29 21:13:48
【问题描述】:

我有一个表单,用户可以在其中添加 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 只是将表单数据转换为对象)

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

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

【问题讨论】:

  • data.row 是一个包含每一行输入的对象,data.start 是开始日期,data.end 是结束日期(在对象中输入)?

标签: javascript jquery


【解决方案1】:

我有一个答案给你,但效率不高(同样是 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。但这对你有用,如果你没有像 100.000 这样大的 length 变量,它只会膨胀!

【讨论】:

  • 好答案。现在我将发表评论以优化它。如果您有大量行,我会先对它们进行排序,那么您可以只执行 1 个循环并询问 x 在 x-1 完成后是否开始。
  • 是的。但我想这也取决于您的浏览器使用的排序算法的顺序。应该比 O(n^2) 好
  • 您的代码实际上不是 O((n^2)/2),因为您的工作是 OP 代码的一半吗?
  • 没有。 O(n^2) = O((n^2)/2),因为1/2是一个常数,即使后者更精确,说O(n^2)是对的
猜你喜欢
  • 2017-05-28
  • 2016-01-05
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 2019-01-27
相关资源
最近更新 更多