如何对嵌套数组中的对象按日期分组并计算位移平均值?
按日期分组并计算位移平均值的实现方法
问题描述
现有如下嵌套数组,数组元素为包含date和displacement字段的对象:
let arr = [ [ {date: 1578787200000, displacement: 0}, {date: 1580860800000, displacement: 1}, {date: 1593302400000, displacement: 2}, {date: 1606780800000, displacement: 3} ], [ {date: 1578787200000, displacement: 10}, {date: 1580860800000, displacement: 20}, {date: 1593302400000, displacement: 30}, {date: 1606780800000, displacement: 40} ] ]
需要按date字段对所有对象分组,计算每组displacement的平均值,最终得到如下结果:
[ {date: 1578787200000, displacement: 5}, {date: 1580860800000, displacement: 10.5}, {date: 1593302400000, displacement: 16.5}, {date: 1606780800000, displacement: 21.5} ]
尝试用reduce()和forEach()实现但未得到预期结果,代码如下:
let res = arr.reduce(function (prev, currentArr) { currentArr.forEach(function (obj) { (prev.date == obj.date || []).push(prev.displacement + obj.displacement) }, 0); return prev; });
解决方案
正确实现代码
const arr = [ [ {date: 1578787200000, displacement: 0}, {date: 1580860800000, displacement: 1}, {date: 1593302400000, displacement: 2}, {date: 1606780800000, displacement: 3} ], [ {date: 1578787200000, displacement: 10}, {date: 1580860800000, displacement: 20}, {date: 1593302400000, displacement: 30}, {date: 1606780800000, displacement: 40} ] ]; // 1. 分组统计每个日期的位移总和与数据量 const groupedData = arr.reduce((acc, subArray) => { subArray.forEach(item => { const { date, displacement } = item; // 若当前日期未在统计对象中,初始化总和与计数 if (!acc[date]) { acc[date] = { total: 0, count: 0 }; } acc[date].total += displacement; acc[date].count += 1; }); return acc; }, {}); // 必须指定reduce初始值为空对象,确保统计结构正确 // 2. 将统计结果转换为目标格式的数组 const result = Object.entries(groupedData).map(([dateStr, stats]) => ({ date: Number(dateStr), displacement: stats.total / stats.count })); console.log(result);
代码说明
分组统计阶段:
- 给
reduce设置初始值{},确保累加器acc始终是用于统计的对象,而非数组元素。 - 遍历每个子数组中的对象,以
date为键存储该日期对应的位移总和(total)和数据数量(count),实现快速分组。
- 给
格式转换阶段:
- 用
Object.entries()将统计对象转换为键值对数组,便于遍历。 - 映射每个键值对为目标格式的对象,注意将字符串类型的
date转回数字,同时计算平均值。
- 用
原代码问题分析
- 未给
reduce指定初始值,导致prev默认取数组的第一个子数组,结构不符合统计需求。 (prev.date == obj.date || []).push(...)逻辑错误:prev是数组时不存在date属性,无法匹配日期;且该写法无法实现正确的累加逻辑。
内容的提问来源于stack exchange,提问作者nworbi
相关产品推荐
相关产品推荐

