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

如何对嵌套数组中的对象按日期分组并计算位移平均值?

按日期分组并计算位移平均值的实现方法

问题描述

现有如下嵌套数组,数组元素为包含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);

代码说明

  1. 分组统计阶段:

    • 给reduce设置初始值{},确保累加器acc始终是用于统计的对象,而非数组元素。
    • 遍历每个子数组中的对象,以date为键存储该日期对应的位移总和(total)和数据数量(count),实现快速分组。
  2. 格式转换阶段:

    • 用Object.entries()将统计对象转换为键值对数组,便于遍历。
    • 映射每个键值对为目标格式的对象,注意将字符串类型的date转回数字,同时计算平均值。

原代码问题分析

  • 未给reduce指定初始值,导致prev默认取数组的第一个子数组,结构不符合统计需求。
  • (prev.date == obj.date || []).push(...)逻辑错误:prev是数组时不存在date属性,无法匹配日期;且该写法无法实现正确的累加逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 10:17:26