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ò
相关产品推荐
相关产品推荐

