如何对JavaScript数组按日期分组并求和、统计行数、计算平均值
实现方案
完全可以实现,以下是具体思路和可直接运行的代码:
核心思路
- 加载CSV文件后拆分所有数据行
- 按日期(时间字符串截取空格前的年月日部分)为维度分组
- 遍历每行数据时累加对应分组的目标字段总和、行数
- 遍历完成后按分组计算平均值,输出指定格式的结果
完整代码
针对你用D3加载的场景,调整加载方式避免无表头CSV丢数据,代码可直接替换你的原有逻辑:
d3.queue() .defer(d3.text, "test.csv") // 无表头CSV用text加载更稳妥 .await(function(error, dataText) { if (error) throw error; // 拆分行为数组,过滤空行 const rows = dataText.split('\n').filter(row => row.trim()); const groupMap = {}; rows.forEach(row => { const fields = row.split(','); // 提取日期(仅年月日) const date = fields[0].split(' ')[0]; // 取姓名前的数值(第三个逗号分隔值,索引从0开始为2) const targetVal = Number(fields[2].trim()); // 初始化分组 if (!groupMap[date]) { groupMap[date] = { sum: 0, count: 0 }; } groupMap[date].sum += targetVal; groupMap[date].count += 1; }); // 生成最终结果数组 const result = Object.entries(groupMap).map(([date, data]) => { const avg = Number((data.sum / data.count).toFixed(2)); // 如需输出逗号分隔的字符串,可改为 return `${date},${data.sum},${data.count},${avg}` return [date, data.sum, data.count, avg]; }); // 输出结果,后续其他计算可直接基于result处理 console.log(result); });
说明
- 代码计算结果和你给出的示例完全匹配:2021-09-01总和35、行数3,平均值可根据需求选择保留两位小数的截断值11.66或四舍五入值11.67;2021-09-02总和92、行数4、平均值23。
- 如果你的CSV实际有表头,只需把加载方式改回d3.csv,然后按表头字段名取值即可,无需手动拆分行。
内容的提问来源于stack exchange,提问作者RyanIs
相关产品推荐
相关产品推荐

