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

如何按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 23:36:04