如何按连续序列分组数组对象 保留相邻重复项最新记录
连续重复日志去重实现方案
核心思路
因为输入数组已经按时间倒序排列,同用户同操作的连续片段中,第一条就是该片段时间最新的记录,不需要全局分组,只需要单次遍历做相邻比对即可:
- 初始化结果数组,先放入第一条日志(最新的一条必然保留)
- 从第二条开始遍历,每次拿当前日志和结果数组里最后一条已保留的日志比对
- 如果当前日志和上一条保留日志的
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
相关产品推荐
相关产品推荐

