我有一个像这样的数组,其中一个对象位于嵌套数组内:
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;
});
实现这一目标的最佳方法是什么?
您可以先分组,然后获得每组的平均值和结果。
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; }
在计算平均值之前,您需要知道相同日期的数量。
使用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)