JavaScript如何实现数组先按ID分组再按时间聚合计算duration
实现方案
你已经完成了按ID分组的核心第一步,后续只需要遍历每个ID对应的分组数组,做聚合计算即可,完整实现代码如下:
const data = [ { "name": "ted", "id": "1", "timestamp": 1512709024000 }, { "name": "seth", "id": "2", "timestamp": 1512754631000 }, { "name": "joe", "id": "1", "timestamp": 1512711000000 }, { "name": "phil", "id": "2", "timestamp": 1512754583000 }, { "name": "kane", "id": "1", "timestamp": 1512709065294 }, ] // 第一步:按ID分组(修正了你原有代码的变量名错误) const groupById = data.reduce((acc, item) => { const group = acc[item.id] || [] group.push(item) acc[item.id] = group return acc }, {}) // 第二步:对每个分组做聚合计算 const result = {} Object.entries(groupById).forEach(([id, items]) => { // 提取当前分组所有时间戳 const timestamps = items.map(i => i.timestamp) const minTime = Math.min(...timestamps) const maxTime = Math.max(...timestamps) // 生成聚合结构 result[id] = [{ duration: maxTime - minTime, names: items.map(i => i.name), startTime: minTime }] }) const finalOutput = { result } console.log(finalOutput)
逻辑补充说明
- 如果你需要设置时间间隔阈值(比如相邻条目时间差超过指定值就拆分为不同的时间段,生成多个聚合条目),可以在第二步处理前先把分组内的条目按时间戳排序,再遍历判断相邻条目的时间差,超过阈值就拆分新的聚合组即可
- 上述代码输出的结构和你给出的示例完全一致,
duration单位和输入的timestamp单位保持一致(示例中为毫秒)
内容的提问来源于stack exchange,提问作者ronoc4
相关产品推荐
相关产品推荐

