2012-02-22 83 views
0

我有JSON的列表值的Javascript搜索范围

[{'start_day':1,'start_hour':1,'end_day':1,'end_hour':2}, 
{'start_day':1,'start_hour':4,'end_day':1,'end_hour':6}, 
{'start_day':1,'start_hour':9,'end_day':1,'end_hour':11}] 

现在在Javascript中我有一个表,让我更多的这些添加到表中。我可以做到这一点没有问题,但我正在寻找的是。是否有任何代码可以让我搜索以确保用户没有输入重叠的日期时间范围。类似于SQL之间的命令。

回答

0

由于您指的是7天x 24小时范围,因此创建一个包含所有值的表格可能很有用。这样做的好处是,您不必为每个新元素重复计算。相反,你可以添加一个计数器。

在你的情况下,计数器应该始终为零或一(因为日期可能不重叠,每个定义)。但是,可以使用相同的函数也可以使用来确定给定一组对象是否有重叠。然后,其中一个计数器大于一个。

代码(演示:http://jsfiddle.net/EtaJE/1/):

// Initialize list and variables. 
var totalHours = 7*24; 
var dates = [];        // Empty list 
for (var i=0; i<totalHours; i++) dates.push(0);// Fill list with zeros 

/* @param listi object { start_day ; end_day ; start_hour ; end_hour } 
* @param one number Recommended values: 1 (add), -1 (remove) 
*/ 
function addDate(listi, one) { 
    one = +one === one ? one : 1; // Make sure that one is a number. 

    var listi = list[i]; 
    if (listi.start_day <= listi.end_day) { 
     var start = listi.start_day * 24 + listi.start_hour; 
     var end = listi.end_day * 24 + listi.end_hour; 
     for (var j=start; j<end; j++) { 
      dates[j] += one; // Increase counter by one 
     } 
    } else { 
     var start = listi.start_day * 24 + listi.start_hour; 
     var end = listi.end_day * 24 + listi.end_hour; 
     for (var j=0; j < end; j++) { 
      dates[j] += one; // Increase counter by one 
     } 
     for (var j=start; j<totalHours; i++) { 
      dates[j] += one; // Increase counter by one 
     } 
    } 
} 

/* 
* @param object { start_day ; end_day ; start_hour ; end_hour } 
*/ 
function doesDateOverlap(listi) { 
    if (listi.start_day <= listi.end_day) { 
     var start = listi.start_day * 24 + listi.start_hour; 
     var end = listi.end_day * 24 + listi.end_hour; 
     for (var j=start; j<end; j++) { 
      if (dates[j]) return true; // Not zero, overlapping! 
     } 
    } else { 
     var start = listi.start_day * 24 + listi.start_hour; 
     var end = listi.end_day * 24 + listi.end_hour; 
     for (var j=0; j < end; j++) { 
      if (dates[j]) return true; // Not zero, overlapping! 
     } 
     for (var j=start; j<totalHours; i++) { 
      if (dates[j]) return true; // Not zero, overlapping! 
     } 
    } 
    return false; // At this point: No overlap, so OK. 
} 


// Parse the values from the JSON list. Example: 
var list = [{'start_day':1,'start_hour':1,'end_day':1,'end_hour':2}, 
      {'start_day':1,'start_hour':4,'end_day':1,'end_hour':6}, 
      {'start_day':1,'start_hour':9,'end_day':1,'end_hour':11}] 
for (var i=0; i<list.length; i++) { 
    addDate(list[i], 1); 
} 

// Example 
if (doesDateOverlap({'start_day':1,'start_hour':1,'end_day':1,'end_hour':11})){ 
    alert('Overlap!'); 
} 
+0

这工作的程度。我的星期从 星期日0到星期六6.如果我在星期五开始时间并将它运行到星期二2.我会更新脚本http://jsfiddle.net/EtaJE/1/ – TheMonkeyMan 2012-02-22 13:06:22

+0

@Deano更新回答。请注意,我的时间范围从0到23。 – 2012-02-22 14:25:02