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

JS月度周度图表数据处理:缺失周数据的对象数组填充0值方案咨询

实现方案

直接基于你预设1-4周数组的思路实现,逻辑更简单,同时优化了原有代码的性能问题:

  1. 先过滤出目标月份的所有数据,统一做每周数据聚合,避免循环内重复执行reduce计算
  2. 不再遍历聚合结果的key生成返回数组,改为遍历固定的1-4周数组,缺失周自动补0,保证周数完整
  3. 移除了原代码中按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:36:03