基于日期范围生成多组日期数组的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天数据后,循环不再继续添加新日期,无法得到完整的分组结果。
问题原因
- 未重置
week数组:当week长度达到7时,仅将其推入weekObj,但没有清空week。后续循环中week.length始终为7,一直进入if分支,不会再添加新日期。 - 引用传递隐患:直接
weekObj.push(week)是把数组的引用推入,后续如果修改week,weekObj里的元素也会跟着变化。 - 函数定义冗余:
removeTime函数在else分支内定义,每次进入分支都会重新创建函数,完全没必要。 - 遗漏最后一组数据:循环结束后,若
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
相关产品推荐
相关产品推荐

