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
相关产品推荐
相关产品推荐

