前端对多对时间段进行处理 取并集合并没有交集的项

// timePairList = [{startTime:'2022-07-20 05:00:00','endTime':'2022-07-20 18:50:00'},{startTime:'2022-07-20 07:00:00','endTime':'2022-07-20 19:50:00'},{startTime:'2022-07-20 06:00:00','endTime':'2022-07-20 07:10:00'}]// 三个互相交叉

// timePairList = [{startTime:'2022-07-20 05:00:00','endTime':'2022-07-20 18:50:00'},{startTime:'2022-07-20 07:00:00','endTime':'2022-07-20 19:50:00'},{startTime:'2022-07-20 20:00:00','endTime':'2022-07-20 20:30:00'}]// 两个互相交叉 第三项不交叉

// timePairList = [{startTime:'2022-07-20 05:00:00','endTime':'2022-07-20 18:50:00'},{startTime:'2022-07-20 05:00:00','endTime':'2022-07-20 19:00:00'},{startTime:'2022-07-20 19:00:00','endTime':'2022-07-20 20:10:00'}]

// timePairList = [{startTime:'2022-07-20 05:00:00','endTime':'2022-07-20 18:50:00'},{startTime:'2022-07-20 07:00:00','endTime':'2022-07-20 19:50:00'}]

// timePairList = [{startTime:'2022-07-20 05:00:00','endTime':'2022-07-20 18:50:00'},{startTime:'2022-07-20 04:00:00','endTime':'2022-07-20 19:50:00'},{startTime:'2022-07-20 03:00:00','endTime':'2022-07-20 07:10:00'}]

export const compare = (first, second) => {

const left = [new Date(first.startTime), new Date(first.endTime)];

const right = [new Date(second.startTime), new Date(second.endTime)];

if (left[1] < right[0]) {

// 没有交集

return [first, second];

}

if (left[1] >= right[0]) {

// 有交集

if (left[1] < right[1]) {

return [

{

startTime: first.startTime,

endTime: second.endTime,

},

];

} else {

return [

{

startTime: first.startTime,

endTime: first.endTime,

},

];

}

}

};

export const compose = (arr) => {

arr = arr.sort((a,b)=>{

let startA = moment(a.startTime).valueOf()

let startB = moment(b.startTime).valueOf()

return startA-startB

})

let res = [];

let temp = [arr[0]];

let len = arr.length;

let i = 0;

if (len < 2) {

return arr;

}

while (i < len - 1) {

temp = compare(temp[temp.length - 1], arr[i + 1]);

if (temp.length === 2) {

// 无交集

res.push(temp[0]);

}

i += 1;

}

res.push(temp[temp.length - 1]);

return res;

};


 


 

const arr = [
  { startTime: "2022-07-20 05:00:00", endTime: "2022-07-20 05:50:00" },
  { startTime: "2022-07-20 06:00:00", endTime: "2022-07-20 06:10:00" },
  { startTime: "2022-07-20 07:00:00", endTime: "2022-07-20 07:50:00" },
  { startTime: "2022-07-20 08:10:00", endTime: "2022-07-20 19:50:00" },
];

console.log(compose(arr));

第二种方法:

const mergeTime = (arr: object[]) => { if (arr.length <= 0) { return; } else if (arr.length <= 1) { result = result.concat(arr); return; } const temp: object[] = []; for (let index = 0; index < arr.length - 1; index++) { const element1 = arr[index]; const element2 = arr[index + 1]; const startTimeDiff = moment(element1.endTime).diff( moment(element2.startTime), ); if (startTimeDiff >= 0) { const endTimeDiff = moment(element1.endTime).diff( moment(element2.endTime), ); if (endTimeDiff > 0) { temp.push({ startTime: element1.startTime, endTime: element1.endTime, }); } else { temp.push({ startTime: element1.startTime, endTime: element2.endTime, }); }

if (arr.length > 2) { const nextSource = temp.concat(arr.slice(2)); mergeTime(nextSource); } else { result = result.concat(temp); } break; } else { result.push(element1); if (arr.length > 1) { mergeTime(arr.slice(1)); } break; } } console.log(result, 'result'); };

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值