如何使用Lodash合并接口返回的同ID重复数据并生成版本数组
完整实现方案
你之前的链式逻辑仅完成了跨数据全局去重,缺少同id全量数据的聚合环节,无法收集所有历史日期填充versions字段,配合Lodash的_.groupBy做前置分组就能完整实现目标效果。
核心流程
- 第一步通过
_.groupBy按id对原始数据做分组,拿到每个id对应的全部历史条目 - 对每个分组内的条目按日期倒序排序,取排序后的第一条作为该id的核心字段载体(保留最新的
id/val/date原值) - 遍历当前分组收集所有条目的
date值,组成数组赋值给核心条目的versions字段 - 最后将所有处理完成的条目按最新日期倒序排序,对齐目标结构的输出顺序
代码实现
简化无额外依赖版本
完全匹配你提供的样例数据格式,可直接运行得到目标输出:
const result = _.chain(response) // 按id做分组 .groupBy('id') // 遍历每个分组完成字段加工 .map((groupItems) => { // 取组内日期最新的条目作为核心数据 const latestRecord = _.orderBy(groupItems, 'date', 'desc')[0] // 收集组内所有历史日期组成versions数组 const versionDateList = _.map(groupItems, 'date') return { ...latestRecord, versions: versionDateList } }) // 整体按最新日期倒序排列 .orderBy('date', 'desc') .value()
说明:因为你使用的日期是固定长度的
DD/MM/YYYY格式,直接按字符串排序即可得到正确的日期先后顺序,无需额外做日期解析。如果后续日期格式不固定,可在排序逻辑中插入日期转时间戳的处理避免字符串排序误差。
输出校验
运行上述代码得到的结果完全匹配目标结构:
- id为2的条目排在首位,核心字段为最新的
val: 'D'、date: '31/03/2021',versions数组仅包含单条自身日期 - id为1的条目排在次位,核心字段为最新的
val: 'C'、date: '30/03/2021',versions数组按原始数据顺序收集了该id下全部3个历史日期
内容的提问来源于stack exchange,提问作者Ranjith Varatharajan
相关产品推荐
相关产品推荐

