对对象数组中具有相同值的元素求和

Sum elements with same value in array of objects

我有一个这样的数组:

[{ "x": 2020-06-27T11:26:00.000Z, "y": 499 },
 { "x": 2020-06-27T11:30:00.000Z, "y": 21 }]

我想对每两个小时间隔 (x) 内的 y 值求和。 y 值应组合为 0-2am、2-4am、4-6am 等间隔。

到目前为止我所做的是对同一小时内的元素求和:

var t = {};

unsortedData.forEach((v) => {
    if (t[v.x.getHours()]) {
        t[v.x.getHours()] += v.y;
    } else {
        t[v.x.getHours()] = v.y;
    }
});

unsortedData = t;

这 return 是我的意思:{"13": 512, "15": 98..} 等等。

现在,这段代码有一些问题我不知道如何解决。

首先是如何让它以两小时的间隔而不是同一小时检查工作? 还有什么方法可以获得完整日期的 return 而不是几个小时?

我假设在您的原始数据中 x 属性有 Date 个实例,因为您对这些值调用了 getHours()

您可以清除日期值的小时部分的最低有效位,以便将它们截断为 2 的倍数。尽管使用 UTC*** 方法,并将这些日期部分传递给 Date.UTC 方法,因为您的日期是使用 UTC 字符串初始化的。这为您提供了一个 Unix 纪元编号,您可以将其用作 t 对象的 属性(考虑使用更有意义的名称)。

不过,我会将完整的对象存储在那些 t 属性中,以便最后您可以提取对象值,并以与开始时完全相同的格式结束:

let unsortedData = [
    { "x": new Date("2020-06-27T11:26:00.000Z"), "y": 499 }, 
    { "x": new Date("2020-06-27T11:30:00.000Z"), "y": 21 },
    { "x": new Date("2020-06-27T12:01:00.000Z"), "y": 15 },
    { "x": new Date("2020-06-27T13:59:00.000Z"), "y": 8 },
    { "x": new Date("2020-06-27T14:20:00.000Z"), "y": 30 },
    { "x": new Date("2020-06-27T14:25:00.000Z"), "y": 1 },
];

let t = {};
unsortedData.forEach((v) => {
    let block = Date.UTC(
        v.x.getUTCFullYear(), 
        v.x.getUTCMonth(), 
        v.x.getUTCDate(), 
        v.x.getUTCHours() & 0xFE // ignore last bit of hours binary
    );
    if (t[block]) {
        t[block].y += v.y;
    }
    else
        t[block] = { x: new Date(block), y: v.y };
});
let sortedData = Object.values(t);

console.log(sortedData);