antd RangerPicker组件多段时间交叉判断

164 阅读1分钟

import type { Moment } from 'moment';
import moment from 'moment';

interface IIsTimeMixed {
  (timeRangeArr: [Moment, Moment][], timeType: moment.unitOfTime.StartOf): boolean;
}

/**
 * 判断时间段有没有交叉
 * @param timeRangeArr [Moment,Moment][]
 * @param timeType 时间类型
 * @returns boolean-是否交叉
 */
export const isTimeMixed: IIsTimeMixed = (timeRangeArr, timeType = 'day') => {
  const firArr: number[] = [];
  const secArr: number[] = [];
  let mixed = false;

  (timeRangeArr || []).forEach((item) => {
    if (!item) return;
    firArr.push(item[0].endOf(timeType).valueOf());
    secArr.push(item[1].endOf(timeType).valueOf());
  });

  firArr.sort((a, b) => a - b);
  secArr.sort((a, b) => a - b);

  for (let i = 1; i < timeRangeArr.length; i++) {
    if (firArr[i] <= secArr[i - 1]) {
      mixed = true;
      break;
    }
  }

  return mixed;
};