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

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"
    }
]

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容