首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

JavaScript 聚合分析:將明細 JSON 轉為 all/hour/day 多維統計結構

     編輯:程式設計疑難解答

需求背景

原始數據為包含 time(精確到分)、pv、uv 的對象數組,需聚合為三個維度:

  • all:按原始時間粒度(分)保留,去重合並同時間點數據。
  • hour:按小時聚合,time 格式 YYYY-MM-DD HH,pv/uv 求和。
  • day:按天聚合,time 格式 YYYY-MM-DD,pv/uv 求和。

核心算法:單次遍歷,三維同步聚合

const arr = [...]; // 原始數組
const rst = { all: [], hour: [], day: [] };

// 輔助:查找或創建聚合項
function getOrCreate(list, key) {
    let item = list.find(i => i.time === key);
    if (!item) { item = { time: key, pv: 0, uv: 0 }; list.push(item); }
    return item;
}

for (const rec of arr) {
    const pv = parseInt(rec.pv), uv = parseInt(rec.uv);
    const t = rec.time;           // "2016-02-02 22:15"
    const h = t.slice(0, 13);     // "2016-02-02 22"
    const d = t.slice(0, 10);     // "2016-02-02"

    getOrCreate(rst.all, t).pv += pv; getOrCreate(rst.all, t).uv += uv;
    getOrCreate(rst.hour, h).pv += pv; getOrCreate(rst.hour, h).uv += uv;
    getOrCreate(rst.day, d).pv += pv; getOrCreate(rst.day, d).uv += uv;
}

console.log(rst);

關鍵點

  • 使用 Array.find 實現 O(n) 查找,數據量小(<10萬)完全夠用;大數據量可改用 Map 降為 O(1)。
  • 時間鍵提取用 slice 而非 split,效率更高且格式固定。
  • parseInt 確保數值運算,避免字串拼接。

擴展建議

若需額外維度(週、月),只需增加鍵提取邏輯與聚合列表,無需重構循環結構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved