You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于日期范围生成多组日期数组的JavaScript代码问题排查

日期按周分组循环终止问题排查

需求与问题现象

需求:给定起始日期与结束日期,遍历每日日期并添加至week数组,当week长度达到7时,将其推入weekObj数组,持续循环至结束日期,最终得到按7天分组的二维日期数组。

现有初始代码:

var startDate = new Date('Tue Oct 18 2022 00:00:00 GMT+0800');
var endDate = new Date('Tue Nov 16 2022 00:00:00 GMT+0800');
var week = [];
var weekObj= [];

实现代码:

for(var d = startDate; d <= endDate; d.setDate(d.getDate() + 1)) {
        if(week.length === 7) {
          weekObj.push(week)
        } else {
          function removeTime(date) {
            return new Date(
              date.getFullYear(),
              date.getMonth(),
              date.getDate()
            )
          }
          let date = removeTime(d)
          week.push(date)
        }
      }
      console.log(week)
      console.log(week.length)

现象:仅生成第一组7天数据后,循环不再继续添加新日期,无法得到完整的分组结果。

问题原因

  1. 未重置week数组:当week长度达到7时,仅将其推入weekObj,但没有清空week。后续循环中week.length始终为7,一直进入if分支,不会再添加新日期。
  2. 引用传递隐患:直接weekObj.push(week)是把数组的引用推入,后续如果修改week,weekObj里的元素也会跟着变化。
  3. 函数定义冗余:removeTime函数在else分支内定义,每次进入分支都会重新创建函数,完全没必要。
  4. 遗漏最后一组数据:循环结束后,若week还有未推入的日期(不足7天的情况),不会被加入weekObj。

修复后的代码

// 把时间清除函数提到循环外,避免重复定义
function removeTime(date) {
  return new Date(
    date.getFullYear(),
    date.getMonth(),
    date.getDate()
  )
}

var startDate = new Date('Tue Oct 18 2022 00:00:00 GMT+0800');
var endDate = new Date('Tue Nov 16 2022 00:00:00 GMT+0800');
var week = [];
var weekObj= [];

// 复制起始日期,避免修改原起始日期
var currentDate = new Date(startDate);
while (currentDate <= endDate) {
  let date = removeTime(currentDate);
  week.push(date);
  
  // 当week满7天,推入后重置数组
  if (week.length === 7) {
    weekObj.push([...week]); // 用扩展运算符创建新数组,避免引用问题
    week = [];
  }
  
  // 推进到下一天
  currentDate.setDate(currentDate.getDate() + 1);
}

// 循环结束后,把剩余不足7天的日期组也推入
if (week.length > 0) {
  weekObj.push(week);
}

console.log(weekObj);
console.log(weekObj.length);

修复说明

  • 将removeTime函数移出循环,避免重复定义造成的性能浪费。
  • 使用while循环逻辑更清晰,同时复制起始日期到currentDate,防止修改原startDate。
  • 每次week满7天后,用[...week]创建新数组推入weekObj,避免引用传递导致的后续修改问题,然后重置week为空数组,继续收集下一组日期。
  • 循环结束后补充处理剩余的不足7天的日期组,确保所有日期都被正确分组。

内容的提问来源于stack exchange,提问作者john

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 19:50:46