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

