如何对嵌套数组中的对象进行分组并求平均值?

问题描述 投票:0回答:2

我有一个像这样的数组,其中一个对象位于嵌套数组内:

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: 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;
});

实现这一目标的最佳方法是什么?

javascript arrays
2个回答
0
投票

您可以先分组,然后获得每组的平均值和结果。

const
    data = [[{ 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 }]],
    result = Object
        .values(Object.groupBy(data.flat(), ({ date }) => date))
        .map(group => ({
            date: group[0].date,
            displacements: group.reduce((t, { displacement }) => t + displacement, 0) / group.length
        }));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


0
投票

在计算平均值之前,您需要知道相同日期的数量。

使用reduce添加同一日期的所有位移,记录计数。

然后映射分组结果并计算平均值

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} ] ]

let res = arr.flat().reduce((p, c) => {
    if (!p[c.date]) p[c.date] = { ...c, count: 0 };
    p[c.date].displacement += c.displacement;
    p[c.date].count ++;
    return p;
}, {});

res = Object.values(res).map(({date, displacement, count}) => {
  return { date, displacement: displacement / count };
});
console.log(res)

© www.soinside.com 2019 - 2024. All rights reserved.