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

JS如何按周分组日期对象数组?对象能否重复定义同名属性?

解答

核心结论

  • 按周分组的需求完全可以实现,但你写的预期输出结构存在语法问题,无法正常使用。
  • JavaScript对象不支持定义同名属性:如果在对象字面量中重复写相同的属性名,后写的属性值会直接覆盖前序的同名属性值,最终对象里只会保留最后一个同名属性。比如你写的{week:1, status:1, status:2}实际运行时会被解析为{week:1, status:2},第一个status值会直接丢失,根本存不住同周的多个status。

正确实现方案

你需要调整目标数据结构,把同周的status值存在数组字段中,再做周维度分组即可。
以下是可直接运行的实现代码:

// 周数计算工具函数,可根据自身周起始规则(周一/周日)、周计数起点(当年第一天/数据集最早日期)调整
function getWeekNumber(date, startDate) {
  const current = new Date(date);
  const start = new Date(startDate);
  const diffTime = current - start;
  const diffDays = diffTime / (24 * 60 * 60 * 1000);
  return Math.ceil((diffDays + start.getDay() + 1) / 7);
}

// 原始数据
const data = [
  {"id": 1, "status": 1, "createdAt": "2022-05-01T08:28:36.284Z"},
  {"id": 2, "status": 2, "createdAt": "2022-05-02T07:17:11.724Z"},
  {"id": 3, "status": 3, "createdAt": "2022-05-10T07:03:44.465Z"},
  {"id": 4, "status": 3, "createdAt": "2022-05-11T16:17:48.863Z"}
];

// 如需以数据集最早日期为第1周的起点,打开下面注释即可
const earliestDate = new Date(Math.min(...data.map(item => new Date(item.createdAt))));
// 若要以当年1月1日为第1周起点,替换为下面这行
// const earliestDate = new Date(new Date(data[0].createdAt).getFullYear(), 0, 1);

// 分组逻辑
const weekGroup = {};
data.forEach(item => {
  const weekNum = getWeekNumber(item.createdAt, earliestDate);
  if (!weekGroup[weekNum]) {
    weekGroup[weekNum] = {
      week: weekNum,
      statusList: [],
      rawData: []
    };
  }
  weekGroup[weekNum].statusList.push(item.status);
  weekGroup[weekNum].rawData.push(item);
});

const newData = Object.values(weekGroup);

针对你提供的测试数据,以数据集最早日期为第1周起点时,输出结果如下,完全匹配你想要的分组逻辑:

[
  {
    week: 1,
    statusList: [1, 2],
    rawData: [/*id为1、2的原始数据对象*/]
  },
  {
    week: 2,
    statusList: [3, 3],
    rawData: [/*id为3、4的原始数据对象*/]
  }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:27:18