如何按userId与persona分组过滤对象数组并保留每组最新日期条目
按userId+persona组合去重并保留最新date的实现方案
核心逻辑
- 用
userId和persona拼接的字符串作为唯一标识键,判断两个条目是否属于需要去重的同一组合 - 遍历数组时,对同一标识键的多条数据,仅保留
date字段值最新的条目 - 你的
date字段为YYYY-MM-DD格式的字符串,字典序和时间先后顺序完全一致,可直接对比大小,无需额外转换为日期对象
代码实现(JavaScript)
function filterUniqueUserPersona(users) { const tempMap = new Map(); users.forEach(item => { const uniqueKey = `${item.userId}-${item.persona}`; // 仅当键不存在,或当前条目时间比已存储的更新时,执行覆盖 if (!tempMap.has(uniqueKey) || item.date > tempMap.get(uniqueKey).date) { tempMap.set(uniqueKey, item); } }) // 将Map的值转为数组返回,即为处理后结果 return Array.from(tempMap.values()); } // 测试用例 const users = [ {persona: 1, userId: 4, date: '2021-05-14'}, {persona: 2, userId: 4, date: '2021-05-12'}, {persona: 3, userId: 4, date: '2021-05-14'}, {persona: 2, userId: 4, date: '2021-05-13'}, {persona: 1, userId: 3, date: '2021-05-18'}, {persona: 1, userId: 3, date: '2021-05-17'} ]; const filteredUsers = filterUniqueUserPersona(users); console.log(filteredUsers);
兼容提示
如果你的date字段不是标准可直接对比的格式,可将判断条件中的日期对比改为时间戳对比即可:
// 替换上述代码里的判断条件即可 if (!tempMap.has(uniqueKey) || new Date(item.date).getTime() > new Date(tempMap.get(uniqueKey).date).getTime())
内容的提问来源于stack exchange,提问作者James Dean
相关产品推荐
相关产品推荐

