時間配列で重複を削除

3408 ワード

最近、緊急の需要を受けて、社員のためにクラスを調整していますが、この社員は当日休暇時間があります.休憩時間があります.食事時間があります.だからこの社員は当日のシフトの時間が長いはずです.
この需要に対して、このようなデータがあります.
var schedule = {
    beginTime: '2019-05-24 20:00',
    endTime: '2019-05-25 07:00'
}

var leaveTime = [{
    beginTime: '2019-05-24 18:00',
    endTime: '2019-05-25 00:00'
}]

var mealTime = [{
    beginTime: '2019-05-24 23:00',
    endTime: '2019-05-25 01:00'
}]

var breakTime = [{
    beginTime: '2019-05-25 00:00',
    endTime: '2019-05-25 02:00'
}, {
    beginTime: '2019-05-25 04:00',
    endTime: '2019-05-25 06:00'
}]
休暇を取って、食事の時間帯はシフトの区間外にあります.(なぜいいですか?これは需要です.)だから、休暇と食事については先に処理しなければなりません.まず分析してみます.ここでは休暇を例に挙げます.
  • もしクラス8~18で12~15を休むなら、この休暇は有効
  • もしクラス8~18で7~10を休むなら、休暇の有効期間は8~10
  • もしクラス8~18の場合、15~20を休暇としたら、休暇の有効期間は15~18
  • 上記の結論に対して、コードロジックは以下の通りである.
    function getExceptTimePeriodInSchedule(schedule, timePeriod){
        const BT = schedule.beginTime;
        const ET = schedule.endTime;
        let exceptTimePeriod = [];
        _.each(timePeriod, timeRange=>{
            let { beginTime, endTime } = timeRange;
            if(beginTime < BT && endTime >= BT && endTime < ET){
                exceptTimePeriod.push({
                    beginTime: BT,
                    endTime
                });
            }else if(beginTime >= BT && beginTime < ET && endTime <= ET){
                exceptTimePeriod.push({
                    beginTime,
                    endTime
                });
            }else if(beginTime >= BT && beginTime < ET && endTime > ET){
                exceptTimePeriod.push({
                    beginTime,
                    endTime: ET
                });
            }else if(beginTime < BT && endTime > ET){
                exceptTimePeriod.push({
                    beginTime: BT,
                    endTime: ET
                });
            }
        })
        return exceptTimePeriod;
    }
    get Except TimePeriodInSchedule方法によると、私達はすでにすべてのシフト区間のデータを取得しました.この時は、休暇、休憩、食事のクロスを処理します.三つの配列を見て、考えてみてもちょっと慌しくて、まず頭の中で瞬間的に各配列を通して交差問題を解決できないと決めました.まず図を描いてからよく考えます.
  • 休暇、休憩、食事は無秩序であり、まず休暇、休憩、食事は昇順に並べられ、開始時間は同じで、終了時間によって昇順される.
  • 休暇、休憩、食事は各行列があり、処理がよくないので、私達は彼らを一つの配列に統合します.このように私達が直面する問題は一つの配列の交差が繰り返します.
  • 単一の配列が重いので、知っています. = - - - filterSetなどの方法があります.知らないならHow to Remove Aray Duplicates in ES 6を見てもいいです.私たちが直面した困難に対して、私たちはreduceで解決するつもりです.
  • 対応コードは以下の通りです.
    function getExceptTimePeriod(timePeriod){
        timePeriod = _.sortBy(timePeriod, ['beginTime', 'endTime']);
        timePeriod = _.reduce(
            timePeriod,
            (result, item) => {
                let last = result[result.length - 1];
                if (last) {
                    if (item.beginTime <= last.endTime &&
                        item.beginTime >= last.beginTime &&
                        item.endTime > last.endTime) {
                        last.endTime = item.endTime;
                    } else {
                        result.push(item);
                    }
                    return result;
                } else {
                    result.push(item);
                    return result;
                }
            },
            []
        );
        return timePeriod;
    };
    上の2つの重要な方法によって、クロスしない時間帯を取得することができます.この文章はあなたに役に立つと思います.どうぞよろしくお願いします.