我有一个表单,用户可以在其中添加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行已经在数组中。
答案 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
变量,它只会膨胀!