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

如何按连续序列分组数组对象 保留相邻重复项最新记录

连续重复日志去重实现方案

核心思路

因为输入数组已经按时间倒序排列,同用户同操作的连续片段中,第一条就是该片段时间最新的记录,不需要全局分组,只需要单次遍历做相邻比对即可:

  • 初始化结果数组,先放入第一条日志(最新的一条必然保留)
  • 从第二条开始遍历,每次拿当前日志和结果数组里最后一条已保留的日志比对
  • 如果当前日志和上一条保留日志的user、action都一致,说明属于同一个连续重复段,直接跳过
  • 如果任意字段不一致,说明进入了新的连续片段,把当前日志加入结果数组
  • 遍历完成后结果数组就是目标输出

可运行代码实现

function processLogs(sortedLogs) {
  if (sortedLogs.length === 0) return []
  const res = [sortedLogs[0]]
  for (let i = 1; i < sortedLogs.length; i++) {
    const cur = sortedLogs[i]
    const last = res[res.length - 1]
    if (cur.user !== last.user || cur.action !== last.action) {
      res.push(cur)
    }
  }
  return res
}

// 输入测试数据
const inputLogs = [
    {
        "timestamp": "2022-07-14T14:53:32.925Z",
        "action": "Action 1",
        "user": "User A"
    },
    {
        "timestamp": "2022-07-13T14:53:32.925Z",
        "action": "Action 1",
        "user": "User A"
    },
    {
        "timestamp": "2022-07-12T14:53:32.925Z",
        "action": "Action 1",
        "user": "User A"
    },
    {
        "timestamp": "2022-07-11T14:53:32.925Z",
        "action": "Action 2",
        "user": "User A"
    },
    {
        "timestamp": "2022-07-10T14:53:32.925Z",
        "action": "Action 2",
        "user": "User A"
    },
    {
        "timestamp": "2022-07-09T14:53:32.925Z",
        "action": "Action 1",
        "user": "User A"
    },
    {
        "timestamp": "2022-07-08T14:53:32.925Z",
        "action": "Action 1",
        "user": "User A"
    },
    {
        "timestamp": "2022-07-07T14:53:32.925Z",
        "action": "Action 3",
        "user": "User B"
    }
]

// 执行处理,输出结果和预期完全一致
console.log(processLogs(inputLogs))

方案优势

  • 时间复杂度为O(n),仅需一次遍历,处理大体积日志数组时性能优异
  • 不会做全局去重,非连续的同用户同操作记录会被正常保留,完全匹配需求
  • 逻辑简单,没有额外依赖,可直接在任意JavaScript环境运行

内容的提问来源于stack exchange,提问作者Ronny vdb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:24:30