原始數據為包含 time(精確到分)、pv、uv 的對象數組,需聚合為三個維度:
time 格式 YYYY-MM-DD HH,pv/uv 求和。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 確保數值運算,避免字串拼接。若需額外維度(週、月),只需增加鍵提取邏輯與聚合列表,無需重構循環結構。