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

2023-09-26  本文已影响0人  EverglowLyu
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"
    }
]

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

上一篇 下一篇

猜你喜欢

热点阅读