检查时间冲突,只想显示 1 个警告
Checking for time conflicts, want to show just 1 warning
我有一个表单,用户可以在其中添加 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
,它会膨胀!
相关文章:
- 在html页面的iframe中显示一个警告框
- Java 警告 (?) 在 Eclipse (Juno) 中显示为 JavaScript 代码
- 正确禁止显示数据表中的警告
- Jquery单击按钮时不显示警告框
- 有一种方法可以使jslint在使用控制台时显示警告或错误
- 在联系人表单中显示隐藏警告被延迟
- 如何根据所选日期显示警告
- jQuery image丢弃无效的图像类型,并显示一条无效的消息而不是警告框
- 希望在不创建新类的情况下将警告图标显示在正确的位置
- 使用 JavaScript 显示错误消息,不带 OUT 警告框
- 检查时间冲突,只想显示 1 个警告
- 在 javascript 中动态显示一个带有换行符的警告框
- 显示使用 PHP 和 JavaScript 的警告框
- 在 中显示警告框 asp.net 将重定向到空白页,然后返回到原始页面
- 我的警告标签未显示在无效输入上
- 推送提交后,如果输入字段为黑色,则显示验证检查或以红色字母显示警告
- 警告显示false,即使类存在
- 为什么在我的应用中弹出警告显示两次
- 延迟"没有Javascript"警告显示
- 警告显示两次模态引导