时间片段合并

2021/8/12 11:49:18webjs
/**
 * 1. 时间范围: ["00:00", "23:59"]
 * [
 *    ["23:00","23:50"],
 *    ["00:00","01:00"],
 *    ["00:30","01:20"],
 *    ["03:00","03:20"],
 *    ["03:20","03:40"],
 * ]
 * 输出:
 * [
 *    ["00:00","01:20"],
 *    ["03:00","03:40"],
 *    ["23:00","23:50"],
 * ]
*/
function mergeTimeRanges(ranges){
  // ranges = ["00:00", "23:59"]  
  let dateStr = new Date().toLocaleDateString();
  let arr =  [
     ["23:00","23:50"],
     ["00:00","01:00"],
     ["00:30","01:20"],
     ["03:00","03:20"],
     ["03:20","03:40"],
  ];
  let fullTimeArr = arr.map(e=>{
    return e.map(sub=>mergeTimeStr(dateStr,sub))
  })
  fullTimeArr = fullTimeArr.sort((a,b)=>{
    return a[0]>b[0]?1:-1;
  })
  
  let backArr = []
  fullTimeArr.forEach(item=>{
    // 排除ranges之外的数据
    if(ranges[0]>=item[1]||ranges[1]<=item[0]){
      return
    }
    
    let last = backArr[backArr.length-1]
    if(last){
      // 第N次取值
      
      // 处理内部时间交叉点
      if(last[1]>=item[0]){ 
        if(ranges[1]<item[1]){
          item[1] = ranges[1]
        }   
        last[1] = item[1]
      }else{            
        backArr.push(item)
      }
    }else{
       // else 第一次取值
       // 处理与ranges交叉点
      if(ranges[0]>item[0]){
        item[0] = ranges[0]
      }
      if(ranges[1]<item[1]){
        item[1] = ranges[1]
      }
      backArr.push(item)
    }   
  })
  
  backArr = backArr.map(item=>{
    return item.map(sub=>{
      return sub.toTimeString().match(/^\d+:\d+/)[0]
    })
  })
  
  function mergeTimeStr(dateStr , time){
    return new Date(`${dateStr} ${time}:00`)
  }
  
  return backArr
}