如何对多维用户历史数组实现按ID去重并按分数排序筛选功能
实现方案
核心逻辑
- 先将嵌套的二维日数据数组扁平化,得到全量历史用户一维数组
- 遍历全量用户数组,用
Map按唯一用户ID做缓存,相同ID对比score字段,始终保留分数最高的用户记录 - 将缓存中的用户记录转换为数组后,按
score字段排序输出
可直接运行的代码示例(JavaScript)
// 你的原始嵌套结构数据 const rawDailyUserData = [ [{id: 1, name: '张三', score: 82}, {id: 2, name: '李四', score: 91}], [{id: 1, name: '张三', score: 95}, {id: 3, name: '王五', score: 87}], [{id: 2, name: '李四', score: 89}, {id: 3, name: '王五', score: 90}] ] // 1. 二维数组扁平化得到全量用户列表 const allHistoryUsers = rawDailyUserData.flat() // 2. 按ID去重,保留每个用户的最高得分记录 const highestScoreMap = new Map() allHistoryUsers.forEach(user => { const savedUser = highestScoreMap.get(user.id) if (!savedUser || savedUser.score < user.score) { highestScoreMap.set(user.id, user) } }) // 3. 按score降序排序,得到最终列表 const result = Array.from(highestScoreMap.values()).sort((a, b) => b.score - a.score)
如果需要按分数升序排序,只需将sort回调的返回值改为a.score - b.score即可。
现有功能复用说明
如果你要复用已经实现的两个独立功能,只需调整执行顺序:
- 先执行「获取全历史用户最高分数」逻辑,得到每个ID对应的最高score用户列表
- 再对该列表执行按score排序逻辑即可
避免先按ID随机去重再排序,导致最终保留的不是用户最高得分记录。
内容的提问来源于stack exchange,提问作者Vlad_glivuk
相关产品推荐
相关产品推荐

