美文网首页
JS循环先排序,如果相邻开始时间和结束时间相同并且重叠并且上一条

JS循环先排序,如果相邻开始时间和结束时间相同并且重叠并且上一条

作者: EverglowLyu | 来源:发表于2023-09-26 14:52 被阅读0次
function mergeTimeSlots(timeList) {
  // 排序时间段
  timeList.sort((a, b) => {
    return new Date(a.startTime) - new Date(b.startTime);
  });

  // 合并重叠的时间段
  let mergedTimeList = [timeList[0]];
  for (let i = 1; i < timeList.length; i++) {
    let currentSlot = timeList[i];
    let previousSlot = mergedTimeList[mergedTimeList.length - 1];

    // 如果当前时间段的开始时间和上一条相同,且结束时间选择长的
    if (
      currentSlot.startTime === previousSlot.startTime &&
      currentSlot.endTime > previousSlot.endTime
    ) {
      previousSlot.endTime = currentSlot.endTime;
    }
    // 如果时间段重叠,且结束时间选择长的
    else if (
      currentSlot.startTime <= previousSlot.endTime &&
      currentSlot.endTime > previousSlot.endTime
    ) {
      previousSlot.endTime = currentSlot.endTime;
    }
    // 如果时间段不重叠,直接添加到结果中
    else if (currentSlot.startTime > previousSlot.endTime) {
      mergedTimeList.push(currentSlot);
    }
  }

  return mergedTimeList;
}

// 示例用法
let timeList =[
    {
        "startTime": "2023-09-01",
        "endTime": "2023-09-01"
    },
    {
        "startTime": "2023-09-01",
        "endTime": "2023-09-01"
    },
    {
        "startTime": "2023-09-01",
        "endTime": "2023-09-01"
    },
    {
        "startTime": "2023-09-02",
        "endTime": "2023-09-03"
    },
    {
        "startTime": "2023-09-02",
        "endTime": "2023-09-02"
    },
    {
        "startTime": "2023-09-02",
        "endTime": "2023-09-02"
    },
    {
        "startTime": "2023-09-02",
        "endTime": "2023-09-02"
    },
    {
        "startTime": "2023-09-02",
        "endTime": "2023-09-02"
    },
    {
        "startTime": "2023-09-02",
        "endTime": "2023-09-02"
    },
    {
        "startTime": "2023-09-03",
        "endTime": "2023-09-04"
    },
    {
        "startTime": "2023-09-03",
        "endTime": "2023-09-03"
    },
    {
        "startTime": "2023-09-03",
        "endTime": "2023-09-03"
    },
    {
        "startTime": "2023-09-04",
        "endTime": "2023-09-06"
    },
    {
        "startTime": "2023-09-04",
        "endTime": "2023-09-06"
    },
    {
        "startTime": "2023-09-04",
        "endTime": "2023-09-04"
    },
    {
        "startTime": "2023-09-04",
        "endTime": "2023-09-04"
    },
    {
        "startTime": "2023-09-04",
        "endTime": "2023-09-04"
    },
    {
        "startTime": "2023-09-04",
        "endTime": "2023-09-04"
    },
    {
        "startTime": "2023-09-04",
        "endTime": "2023-09-04"
    },
    {
        "startTime": "2023-09-04",
        "endTime": "2023-09-04"
    },
    {
        "startTime": "2023-09-04",
        "endTime": "2023-09-04"
    },
    {
        "startTime": "2023-09-04",
        "endTime": "2023-09-04"
    },
    {
        "startTime": "2023-09-04",
        "endTime": "2023-09-04"
    },
    {
        "startTime": "2023-09-04",
        "endTime": "2023-09-04"
    },
    {
        "startTime": "2023-09-04",
        "endTime": "2023-09-04"
    },
    {
        "startTime": "2023-09-04",
        "endTime": "2023-09-04"
    },
    {
        "startTime": "2023-09-04",
        "endTime": "2023-09-04"
    },
    {
        "startTime": "2023-09-04",
        "endTime": "2023-09-04"
    },
    {
        "startTime": "2023-09-04",
        "endTime": "2023-09-04"
    },
    {
        "startTime": "2023-09-04",
        "endTime": "2023-09-04"
    },
    {
        "startTime": "2023-09-06",
        "endTime": "2023-09-07"
    },
    {
        "startTime": "2023-09-06",
        "endTime": "2023-09-06"
    },
    {
        "startTime": "2023-09-07",
        "endTime": "2023-09-08"
    },
    {
        "startTime": "2023-09-08",
        "endTime": "2023-09-10"
    },
    {
        "startTime": "2023-09-08",
        "endTime": "2023-09-08"
    },
    {
        "startTime": "2023-09-08",
        "endTime": "2023-09-08"
    },
    {
        "startTime": "2023-09-08",
        "endTime": "2023-09-08"
    },
    {
        "startTime": "2023-09-08",
        "endTime": "2023-09-08"
    },
    {
        "startTime": "2023-09-08",
        "endTime": "2023-09-08"
    },
    {
        "startTime": "2023-09-11",
        "endTime": "2023-09-24"
    },
    {
        "startTime": "2023-09-11",
        "endTime": "2023-09-11"
    },
    {
        "startTime": "2023-09-11",
        "endTime": "2023-09-11"
    },
    {
        "startTime": "2023-09-13",
        "endTime": "2023-09-14"
    },
    {
        "startTime": "2023-09-14",
        "endTime": "2023-09-24"
    }
];

let mergedTimeList = mergeTimeSlots(timeList);
console.log(mergedTimeList);
//输出
[
    {
        "startTime": "2023-09-01",
        "endTime": "2023-09-01"
    },
    {
        "startTime": "2023-09-02",
        "endTime": "2023-09-10"
    },
    {
        "startTime": "2023-09-11",
        "endTime": "2023-09-24"
    }
]

注意:上述方法对于时间段会重叠但未确保连续的情况也能处理,但是没有对不需要合并的时间段情况进行处理。如果需要对不需要合并的时间段进行处理,可以添加一个判断条件。

相关文章

  • js 排序算法

    排序算法时间复杂度 冒泡排序 如果有 n 个数进行排序,需要循环 n-1 次 每一次循环,从第一位开始进行相邻两个...

  • LeetCode 217: 存在重复

    【记录性文章-数组】 代码思路:先排序,再用循环判断数组中相邻元素是否相同。

  • 常用算法

    [TOC] 排序 冒泡排序法 冒泡排序法,利用两层嵌套循环,相邻数据进行比较,每次内层循环结束,把当前最大数交换到...

  • 开发解决方案 ● 如何知道两个时间段是否重叠?

    问题来源: 活动的创建,如活动A和活动B的开始结束时间,不能重叠在一起 问题描述: A和B的开始结束时间,不能重叠...

  • js设置日历选择范围,并且开始时间不能大于截止时间

    // 初始化时间设置 varDateRange = { startTime:“2016-02”, endTime:...

  • java8 stream自定义分组求和并排序

    结果: 上述代码实现对对象GroupDetailDTO按设备和时间分组求played的和,并且按时间排序了。当初想...

  • 冒泡排序

    姓名,分数,按分数排序 原理:双重循环,相邻的两个数比较大小,交换位置,时间复杂度高

  • Java入门:选择排序、冒泡排序

    Java中带的方法: 选择排序: 内循环一次,最值出现在头角标位置上 冒泡排序: 相邻的两个元素进行比较,如果符合...

  • 冒泡排序,选择排序

    冒泡排序法(相邻两个元素进行比较,如果位置错误则进行互换) 如果没有发生位置互换,则终止循环 选择排序

  • 排序算法

    冒泡排序 冒泡排序涉及到双循环,外层循环控制趟数,内层循环控 制比较次数。 1、比较相邻的元素。如果第一个比第二个...

网友评论

      本文标题:JS循环先排序,如果相邻开始时间和结束时间相同并且重叠并且上一条

      本文链接:https://www.haomeiwen.com/subject/wprhbdtx.html