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

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,提问作者אריאל אריאלל

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 10:24:03