如何在JavaScript中拼接范围?

如何在JavaScript中拼接范围?,javascript,Javascript,我正在开发一个日程管理系统,它将一个人的工作日程加载到一个数组中,然后允许用户在这一天内输入一个新的班次。当然,代码必须遵循以下几条规则: 现有班次和添加的项目之间不得有间隙。这意味着添加的项目的结束时间必须等于或大于第一个项目的开始时间,并且添加的项目的开始时间必须等于或小于最后一个项目的结束时间 添加的班次必须覆盖在其时间范围内发生的任何现有班次。本质上,它需要将自身拼接到阵列中,但我不确定如何使用.splice方法来实现 必须截断/压缩任何受影响的时间块以容纳新项目。例如,如果存在一个持续

我正在开发一个日程管理系统,它将一个人的工作日程加载到一个数组中,然后允许用户在这一天内输入一个新的班次。当然,代码必须遵循以下几条规则:

现有班次和添加的项目之间不得有间隙。这意味着添加的项目的结束时间必须等于或大于第一个项目的开始时间,并且添加的项目的开始时间必须等于或小于最后一个项目的结束时间

添加的班次必须覆盖在其时间范围内发生的任何现有班次。本质上,它需要将自身拼接到阵列中,但我不确定如何使用.splice方法来实现

必须截断/压缩任何受影响的时间块以容纳新项目。例如,如果存在一个持续时间为一小时的现有时间段,并且我们将一个10分钟的时间段注入到中开始的20分钟时间段中,它将导致原始时间段的前20分钟部分,然后是添加的10分钟项目,然后是原始时间段的其余部分。添加的项目还必须能够与其他时间段重叠。因此,如果我们添加一个三小时的时间段,涵盖其他4个时间段或其中的开始/停止时间段!它必须覆盖其中的每一个

这似乎是一个足够简单的任务,因为基本上它只是拼接范围,但我不知道如何在JavaScript中拼接范围

以下是我迄今为止为实现这些规则而编写的代码:

var obj = {
    start: '',
    end: '',
};
var objArray = [];
var tmpArray = [];
var finalArray = [];
objArray.push({start: "12:00", end: "12:45"});
objArray.push({start: "12:45", end: "1:00"});
objArray.push({start: "1:00", end: "1:30"});
objArray.push({start: "1:30", end: "2:30"});
// added object
obj.start = "12:00";
obj.end = "12:10";
for (var i = 0; i < objArray.length; i++) { tmpArray.push(objArray[i]); }
//tmpArray = objArray; // preserve the original array
objArray.push(obj);
console.clear();
console.log("%o", objArray);
objArray.sort(function(a, b) { var x = a.start; var y = b.start; return ((x < y) ? -1 : ((x > y) ? 1 : 0)); });
// sanity check
if (obj.start >= obj.end){
    console.log('Time logic is invalid.');
    return false;
}
if (obj.end < tmpArray[0].start) {
    console.log('There is a gap before the first item.');
    return false;
}
if (obj.start > tmpArray[tmpArray.length - 1].end){
    console.log('There is a gap after the last item.');
    return false;
}

// Now for the fun stuff...
for (var i = 0; i < objArray.length; i++){
    var tmpobj = objArray[i];
    if (tmpobj.start == obj.start && tmpobj.end == obj.end){ // find our inserted object
        index = i;
        console.log('<<< obj injected: %s - %s [%d] >>>', obj.start, obj.end, index);
        if (index == 0){ // is first item, start time was less than first item's start time
            finalArray.push(obj);
            if (obj.end == tmpArray[0].start){
                finalArray.push(tmpArray[0]); // item insertion was a complete prepend...
            } else if (obj.end >= tmpArray[tmpArray.length - 1].end){
                console.log('entire array is consumed'); // item covers entire shift...
            } else {
                // This code is reached when obj start time is before or equal to first item
                console.log('obj <= tmpArray[0].start, end > tmpArray[0].start');
            }
        } else {
            if (obj.start == tmpArray[tmpArray.length - 1].end){
                console.log('Item added at end of shift');
                finalArray.push(tmpArray[i - 1]);
                finalArray.push(obj);
            }
        }
    } else {
        console.log('obj tested: %s - %s [%d]', tmpobj.start, tmpobj.end, i);
        if (obj.start > tmpobj.end) {
            finalArray.push(tmpobj);
        }
        if (obj.end < tmpobj.start) {
            finalArray.push(tmpobj);
        }
    }
// now iterate through array and combine like terms (activity type)
}
for (var i = 0; i < finalArray.length; i++){
    console.log('%d) s: %s, e: %s', i, finalArray[i].start, finalArray[i].end);
}

<>我如何在JavaScript中拼接范围?

< P>你可以分别考虑开始和结束的时间块。从概念上讲,我认为它是一个链表,可以实现为一个数组。特别要求列表中的每个节点必须遵循开始时间->结束时间的顺序,并且不能有两个开始时间节点或两个结束时间节点相邻。空闲时间块之间的任何时间块也由开始时间和结束时间节点定义

Sis启动时间

E是结束时间

有效时间块的数组可能如下所示[S1、E1、S2、E2、S3、E3]

因此,当对逻辑进行编码以插入新的时间块时,您可以通过转到新时间块的相应开始时间节点来找到所需的时间块,然后通过创建结束时间E*节点和标记新时间块开始的新开始时间S-新节点来拼接

[S1、E1、S2、E*、S-新、E2、S3、E3]

然后,您可以通过创建结束时间节点来定义结束时间(如有必要),删除旧的结束时间E2并创建空闲块

[S1、E1、S2、E*、S-新、E-新、S-自由、E-自由、S3、E3]

或者重用先前拼接的旧END_TIME E2节点(如果它们同时结束)

[S1、E1、S2、E*、S-新、E2、S3、E3]

最后你伤害大脑的原因是因为你的代码一次做了太多的事情。我建议将其分解为多个功能,以下是一些建议:

canStart(time)
canEnd(time)
insertBlock(startBlock, endBlock)
removeBlock(startBlock, endBlock)