JS月度周度图表数据处理:缺失周数据的对象数组填充0值方案咨询
实现方案
直接基于你预设1-4周数组的思路实现,逻辑更简单,同时优化了原有代码的性能问题:
- 先过滤出目标月份的所有数据,统一做每周数据聚合,避免循环内重复执行reduce计算
- 不再遍历聚合结果的key生成返回数组,改为遍历固定的1-4周数组,缺失周自动补0,保证周数完整
- 移除了原代码中按amount排序的逻辑(该逻辑会打乱周的顺序,不符合X轴按wk1-wk4顺序展示的需求,若确实需要排序可自行打开注释)
改后完整代码
const byAmount = (statObj) => { // 固定遍历1-4周,保证输出不会缺失周数 return [1, 2, 3, 4].map(weekNum => { return { week: `wk${weekNum}`, // 存在统计值则使用,无数据默认补0 amount: statObj[weekNum] || 0 } }) // 若确实需要按amount排序,可放开下方注释(会打乱周顺序,不推荐用于周维度X轴图表) // .sort((a, b) => a.amount - b.amount) // 月度最多4周,原slice(0,5)逻辑无意义,已删除 }; const getWeeklyFromMonth = (arr, month) => { // 先给所有数据添加周数字段,再过滤出目标月份的数据 const targetMonthData = arr.map(a => ({ ...a, week: Math.floor((moment(a.dateScanned.$date).date() - 1) / 7) + 1 })).filter(data => moment(data.dateScanned.$date).format("MMM") === month) // 统一聚合统计每周的总商品数量 const totalPerWeek = targetMonthData.reduce((acc, cur) => { acc[cur.week] = (acc[cur.week] || 0) + cur.amount return acc }, {}) return byAmount(totalPerWeek) }
输出效果
传入你示例中的聚合结果{1:14, 2:27, 4:43},即可直接得到你需要的输出:
[ { week: 'wk1', amount: 14 }, { week: 'wk2', amount: 27 }, { week: 'wk3', amount: 0 }, { week: 'wk4', amount: 43 } ]
如果当月无任何数据,会自动返回4个amount为0的周数据,不会出现空数组异常。
内容的提问来源于stack exchange,提问作者Don
相关产品推荐
相关产品推荐

