对对象数组中具有相同值的元素求和
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);
我有一个这样的数组:
[{ "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);