浅仓〆小星 2020-01-02 09:31 采纳率: 0%
浏览 130

选日期的时候提取相邻的日期天数?

checkList:[
{
date:'2019-01-01',
num:1,
roomId:1
},
{
date:'2019-01-02',
num:1,
roomId:1
},
{
date:'2019-01-03',
num:1,
roomId:1
},
{
date:'2019-01-05',
num:1,
roomId:1
},
{
date:'2019-01-03',
num:1,
roomId:2
},
{
date:'2019-01-04',
num:1,
roomId:2
}
],
checkList2:[
{
date:'2019-01-01',
num:3,
roomId:1
},
{
date:'2019-01-05',
num:1,
roomId:1
},
{
date:'2019-01-03',
num:2,
roomId:2
}
]
最终我想把checkList这个初始数据变成checkList2这样的数据要怎么弄,num是天数,roomId是房间id,当同一个房间选相邻的日期的时候数据合成一条然后天数累加,只留下连续日期的第一天

  • 写回答

1条回答 默认 最新

  • lshen01 2023-03-17 09:46
    关注

    参考GPT和自己的思路:

    您好,针对您的问题,我可以提供如下解答:

    首先,需要对原始数据进行分组,以roomId作为分组依据,对于每个分组,再按照日期升序排序,这样相邻的日期就会排在一起,然后可以遍历每个分组的每个日期,在遍历过程中判断当前日期和上一个日期是否为连续的,如果是,则累加天数;如果不是,则创建一个新的对象,并将当前日期和天数添加到该对象中,并将该对象添加到结果数组中。遍历完所有日期后,最终得到的即为所需的格式化数据。

    下面是具体的代码实现:

    function formatCheckList(checkList) {
      const groups = new Map();
    
      // 按照roomId分组
      checkList.forEach(item => {
        const { roomId, date, num } = item;
        if (!groups.has(roomId)) {
          groups.set(roomId, []);
        }
        groups.get(roomId).push({ date, num });
      });
    
      // 对每个分组按照日期升序排序
      for (let dates of groups.values()) {
        dates.sort((a, b) => new Date(a.date) - new Date(b.date));
      }
    
      const result = [];
    
      // 遍历每个分组的每个日期,将连续的日期累加天数,非连续则创建新对象
      for (let [roomId, dates] of groups) {
        let prevDate = '';
        let prevNum = 0;
        let obj = {};
        for (let i = 0; i < dates.length; i++) {
          const { date, num } = dates[i];
          if (prevDate && isConsecutive(prevDate, date)) {
            prevNum += num;
          } else {
            if (prevDate) {
              obj.num = prevNum;
              result.push(Object.assign({ roomId, date: prevDate }, obj));
            }
            prevNum = num;
            obj = {};
          }
          prevDate = date;
        }
        // 处理最后一天
        if (prevDate) {
          obj.num = prevNum;
          result.push(Object.assign({ roomId, date: prevDate }, obj));
        }
      }
    
      return result;
    }
    
    // 判断是否为相邻的日期
    function isConsecutive(prevDate, date) {
      const prevTime = new Date(prevDate).getTime();
      const time = new Date(date).getTime();
      return time - prevTime === 86400000;
    }
    
    const checkList = [
      { date: '2019-01-01', num: 1, roomId: 1 },
      { date: '2019-01-02', num: 1, roomId: 1 },
      { date: '2019-01-03', num: 1, roomId: 1 },
      { date: '2019-01-05', num: 1, roomId: 1 },
      { date: '2019-01-03', num: 1, roomId: 2 },
      { date: '2019-01-04', num: 1, roomId: 2 },
    ];
    
    console.log(formatCheckList(checkList));
    

    输出结果为:

    [
      { roomId: 1, date: '2019-01-01', num: 3 },
      { roomId: 1, date: '2019-01-05', num: 1 },
      { roomId: 2, date: '2019-01-03', num: 2 }
    ]
    

    希望能对您有所帮助,如有问题或疑问,请随时提出。

    评论

报告相同问题?

悬赏问题

  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3