JavaScript如何按周分组日期数据 生成年-周-星期三层嵌套结构
实现方案
核心思路
- 依赖
moment.js处理时间逻辑,lodash简化属性赋值操作,也可完全用原生JS实现 - 周规则匹配示例要求:周日为周首日、周六为周末尾
- 统一使用UTC时区解析ISO时间,避免本地时区偏移导致日期计算错误
完整代码实现
// 导入依赖,不需要lodash可以替换为下文的原生写法 const _ = require('lodash'); const moment = require('moment'); // 显式配置周首日为周日,避免环境差异影响计算结果 moment.updateLocale('en', { week: { dow: 0 // 0代表周日,如需周一是首日改设为1即可 } }); function groupTimeData(rawData) { const result = {}; rawData.forEach(item => { const timeStr = item.time; // 用UTC模式解析ISO标准时间,避免时区偏移 const timeMoment = moment.utc(timeStr); // 第一层键:年份 const yearKey = timeMoment.year().toString(); // 计算当前周的起止时间 const weekStart = timeMoment.clone().startOf('week'); const weekEnd = timeMoment.clone().endOf('week'); // 第二层键:周范围字符串,格式DD/MM-DD/MM const weekKey = `${weekStart.format('DD/MM')}-${weekEnd.format('DD/MM')}`; // 第三层键:星期缩写 const weekDayKey = timeMoment.format('ddd'); // 逐层赋值,不存在的层级自动初始化 _.set(result, `${yearKey}.${weekKey}.${weekDayKey}`, timeStr); }); return result; }
无lodash的原生JS替代写法
把上述代码中的_.set替换为以下原生层级判断逻辑即可:
if (!result[yearKey]) result[yearKey] = {}; if (!result[yearKey][weekKey]) result[yearKey][weekKey] = {}; result[yearKey][weekKey][weekDayKey] = timeStr;
测试验证
传入示例给出的测试数据:
const testData = [ { "time": "2021-07-28T18:16:23.994Z" }, { "time": "2021-07-29T18:16:23.994Z" }, { "time": "2021-08-01T15:01:40.267Z" }, { "time": "2021-08-02T15:01:40.267Z" }, { "time": "2020-06-09T15:01:40.267Z" } ]; console.log(JSON.stringify(groupTimeData(testData), null, 4));
输出结果与需求给出的预期结构完全一致。
内容的提问来源于stack exchange,提问作者אריאל אריאלל
相关产品推荐
相关产品推荐

