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

JavaScript对象数组日期透视求和问题求助

问题分析与解决方案

代码错误点

  • 动态属性访问错误:你用了e.tanggal,但tanggal是map的参数变量,不是数据对象e的固定属性,应该用方括号语法e[tanggal]来访问动态日期键对应的值。
  • 逻辑偏离需求:原代码的reduce是在合并对象,而非对日期数值求和,导致结果完全不符合预期,还因为错误的属性访问产生了undefined键。
  • 不必要的map遍历:对date数组逐个map再reduce,重复处理了所有数据,效率低且逻辑混乱。

正确实现方案

实现格式二(结构清晰,推荐使用)

遍历所有数据对象,累加每个日期的数值,最后整理成{date: 日期, total: 总和}的格式:

const data =[{    "username": "MT220047",    "title": "Test",    "position": "Management Trainee",    "department": "Logistic",    "2022-11-15": 1,    "2022-11-16": 2  },  {    "username": "MT220047",    "title": "UntitledForm1",    "position": "Management Trainee",    "department": "Logistic",    "2022-11-16": 1  },  {    "username": "17000691",    "title": "Test",    "position": "Foreman",    "department": "Production",    "2022-11-16": 1,  }]

const date =["2022-11-11","2022-11-12","2022-11-13","2022-11-14","2022-11-15","2022-11-16"]

// 第一步:累加每个日期的总和
const sumMap = {};
data.forEach(item => {
  date.forEach(d => {
    // 存在数值则累加,不存在则加0
    sumMap[d] = (sumMap[d] || 0) + (item[d] || 0);
  });
});

// 第二步:转换为格式二的数组,可选择过滤总和为0的日期
const resultFormat2 = Object.entries(sumMap)
  .filter(([d, total]) => total > 0)
  .map(([d, total]) => ({ date: d, total }));

console.log(resultFormat2);
// 输出:[{"date":"2022-11-15","total":1},{"date":"2022-11-16","total":4}]

实现格式一

基于上面的sumMap,转换为单个日期对象组成的数组:

// 基于已生成的sumMap,转换为格式一
const resultFormat1 = Object.entries(sumMap)
  .filter(([d, total]) => total > 0)
  .map(([d, total]) => ({ [d]: total }));

console.log(resultFormat1);
// 输出:[{"2022-11-15":1},{"2022-11-16":4}]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:40:34