You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 15:24:03