时间段数组根据开始时间与结束时间处理合并成一个

接口返回的数据:
在这里插入图片描述
可以看到类似于第一个的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"
}
*/
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泰日天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值