[英]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;
這返回給我類似: {"13": 512, "15": 98..}
等等。
現在,此代碼存在一些問題,我不知道如何解決。
首先是如何讓它以兩小時的間隔而不是相同的小時檢查工作? 還有什么方法可以返回一個完整的日期而不是幾個小時?
我將假設在您的原始數據中x
屬性具有Date
實例,因為您在這些值上調用getHours()
。
您可以清除日期值的小時分量的最低有效位,以便它們將截斷為 2 的倍數。盡管使用UTC***
方法,並將這些日期分量傳遞給Date.UTC
方法,因為您的日期用 UTC 字符串初始化。 這為您提供了 Unix 紀元編號,您可以將其用作t
object 的屬性(考慮使用更有意義的名稱)。
但是,我會將完整的 object 存儲在這些t
屬性中,以便最后您可以提取 object 值,並最終得到與您開始時完全相同的格式:
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( vxgetUTCFullYear(), vxgetUTCMonth(), vxgetUTCDate(), vxgetUTCHours() & 0xFE // ignore last bit of hours binary ); if (t[block]) { t[block].y += vy; } else t[block] = { x: new Date(block), y: vy }; }); let sortedData = Object.values(t); console.log(sortedData);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.