接口返回的数据:
可以看到类似于第一个的endTime等于 第二个startTime的情况
要求:把首尾相连的时间段合并为一条,不能连贯合并的则抛出,然后继续逻辑
// 接口返回的数据res.data.recordList
// 先把开始时间与结束时间处理为时间戳
for( let i of res.data.recordList){
i.startTime = new Date(i.startTime).getTime()
i.endTime = new Date(i.endTime).getTime()
}
// 调用方法(我这里其它地方用的接口原数据,所以用到了深拷贝,根据自己项目情况来即可) 后面的参数为开始时间和结束时间的参数
let arr = timeMergeFun(JSON.parse(JSON.stringify(res.data.recordList)),'startTime','endTime')
// 方法
// 时间段前后能连续的全部则合并为一个
export function timeMergeFun(list, startTime, endTime) {
// 执行一个按照开始时间的排序,避免接口返回数据顺序混乱,这样第一个数据的开始时间永远都是最小的那个
var lists = list.sort(compare(startTime))
console.log('开始时间排序后------',lists)
var arr = []
var obj = {
[startTime]: null,
[endTime]: null,
}
for (let i of lists) {
// 当对象中为null 给他赋值一个开始时间与结束时间
if (!obj[startTime] && !obj[endTime]) {
obj = {
[startTime]: i[startTime],
[endTime]: i[endTime],
}
// 循环体时间段等于最后一个时间段,放入数组中去
if (i[startTime] == lists[lists.length - 1][startTime] && i[endTime] == lists[lists.length - 1][endTime]) {
arr.push(obj)
}
// 对象的开始时间小于等于循环体的开始时间 并且 对象的结束时间大于等于循环体的开始时间 时
} else if (obj[startTime] <= i[startTime] && obj[endTime] >= i[startTime]) {
// 循环体的开始时间在对象时间段之中,所以对象的结束时间等于循环体的结束时间
obj[endTime] = i[endTime]
// 循环体时间段等于最后一个时间段,放入数组中去
if (i[startTime] == lists[lists.length - 1][startTime] && i[endTime] == lists[lists.length - 1][endTime]) {
arr.push(obj)
}
// 对象的开始时间小于等于循环体的开始时间 并且 对象的结束时间x小于循环体的开始时间 时
} else if (obj[startTime] <= i[startTime] && obj[endTime] < i[startTime]) {
// 原来的对象时间段和现在的时间段不为同一段时间,放入数组中去
arr.push(obj)
// 重新给对象赋值循环体时间
obj = {
[startTime]: i[startTime],
[endTime]: i[endTime],
}
// 循环体时间段等于最后一个时间段,放入数组中去
if (i[startTime] == lists[lists.length - 1][startTime] && i[endTime] == lists[lists.length - 1][endTime]) {
arr.push(
{
[startTime]: i[startTime],
[endTime]: i[endTime],
}
)
}
}
}
for (let j of arr) {
// moment方法自行百度搜索,一款工具类
j[startTime] = moment(j[startTime]).format("YYYY-MM-DD HH:mm:ss")
j[endTime] = moment(j[endTime]).format("YYYY-MM-DD HH:mm:ss")
}
console.log('时间段前后能连续的全部则合并为一个-chulihoude 处理后的数据--', arr)
return arr
}
// 排序 按照开始时间排序
function compare(prop) {
return function (obj1, obj2) {
var val1 = obj1[prop];
var val2 = obj2[prop];
if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
val1 = Number(val1);
val2 = Number(val2);
}
if (val1 < val2) {
return -1;
} else if (val1 > val2) {
return 1;
} else {
return 0;
}
}
}
/*
处理后的
{
endTime: "2023-04-20 17:50:00"
startTime: "2023-04-20 16:07:13"
}, {
endTime: "2023-04-21 12:49:59"
startTime: "2023-04-21 07:49:59"
}, {
endTime: "2023-04-21 15:20:00"
startTime: "2023-04-21 12:50:00"
}, {
endTime: "2023-04-21 17:47:57"
startTime: "2023-04-21 15:20:01"
}
*/