Javascript搜索范围

时间:2012-02-22 10:29:02

标签: javascript arrays json datetime range

我有一个JSON值列表

[{'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 Between命令。

1 个答案:

答案 0 :(得分: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!');
}