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

TypeScript中去除JSON数组重复distinct_id元素的方法

去除数组中重复distinct_id的TypeScript解决方案

假设我有一个包含如下数组的JSON文件:

[
   {
    "distinct_id": "abc",
    "properties": {
      "bookID": "123",
      "userID": "abc"
    }
  },
  {
    "distinct_id": "abc",
    "properties": {
      "bookID": "123",
      "userID": "abc"
    }
  },
  {
    "distinct_id": "ced",
    "properties": {
      "bookID": "123",
      "userID": "ced"
    }
  },
  {
    "distinct_id": "abc",
    "properties": {
      "bookID": "456",
      "userID": "ced"
    }
  }
]

我希望遍历该数组并返回一个新数组,其中每个distinct_id仅保留一个实例(即去除重复项),相当于得到唯一用户数组。我使用TypeScript尝试过Set,但未成功,求可行的解决方法。

为什么直接用Set不行?

因为Set判断对象重复的依据是引用地址,原始数组里的每个对象都是独立的引用,哪怕distinct_id相同,Set也会把它们当成不同元素保留,所以无法直接通过Set实现按distinct_id去重。

可行解决方案

方案1:使用filter + Set(保留首次出现的用户实例)

逻辑直观,用Set记录已处理的distinct_id,遍历数组时只保留首次出现的项:

// 定义数据类型,让代码更规范
interface UserRecord {
  distinct_id: string;
  properties: {
    bookID: string;
    userID: string;
  };
}

// 原始数据数组
const rawData: UserRecord[] = [/* 你的原始JSON数据数组 */];

const seenIds = new Set<string>();
const uniqueUsers = rawData.filter(item => {
  if (seenIds.has(item.distinct_id)) {
    return false;
  }
  seenIds.add(item.distinct_id);
  return true;
});

方案2:使用reduce + Map(灵活控制保留的实例)

如果需要调整保留的实例(比如想保留最后一次出现的项),用Map更灵活:

const uniqueUsers = Array.from(
  rawData.reduce((map, item) => {
    // 若要保留最后一次出现的项,去掉if判断直接覆盖即可
    if (!map.has(item.distinct_id)) {
      map.set(item.distinct_id, item);
    }
    return map;
  }, new Map<string, UserRecord>())
).map(([_, user]) => user);

内容的提问来源于stack exchange,提问作者deadant88

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:39:53