嵌套数组中对象id重复如何去重?已尝试filter/map/Set无效
嵌套数组对象按ID去重解决方案
针对嵌套结构数组中ID重复对象的去重问题,用filter+Set就能解决,核心是先定位到嵌套里的目标数组,再通过记录已出现的ID过滤重复项。
针对当前结构的直接处理代码
假设你的原始数据结构如下:
const data = { "category": { "key": 1, "order": 1, "list": [ { "id": "12345", "desc": "内容1" }, { "id": "12345", "desc": "重复内容" }, { "id": "67890", "desc": "内容2" } ] } };
方法一:保留第一个出现的重复项
用Set记录已出现的ID,配合filter过滤:
const seenIds = new Set(); // 对嵌套的list数组去重 data.category.list = data.category.list.filter(item => { if (seenIds.has(item.id)) return false; seenIds.add(item.id); return true; });
方法二:保留最后一个出现的重复项
如果需要保留最后出现的重复对象,用Map存储最新的对象:
const uniqueMap = data.category.list.reduce((map, item) => { map.set(item.id, item); // 后续重复ID会覆盖之前的 return map; }, new Map()); // 把Map转回数组,替换原list data.category.list = Array.from(uniqueMap.values());
之前失败的可能原因
- 直接把对象放进
Set:对象是引用类型,即使ID相同,每个对象都是独立引用,Set不会识别为重复项。 - 没正确定位嵌套数组:可能误操作了外层对象,而非真正处理
category下的list数组。
通用嵌套数组去重(适配更深层级)
如果数据有多层嵌套数组(比如list里还有子数组),可以用递归函数处理所有含id的数组项:
function removeDuplicateById(obj) { if (Array.isArray(obj)) { const seen = new Set(); return obj.filter(item => { // 先递归处理内部嵌套结构 if (typeof item === 'object' && item !== null) { removeDuplicateById(item); } if (item.id && seen.has(item.id)) return false; item.id && seen.add(item.id); return true; }); } if (typeof obj === 'object' && obj !== null) { for (const key in obj) { obj[key] = removeDuplicateById(obj[key]); } } return obj; } // 调用后直接得到去重后的完整数据 const deduplicatedData = removeDuplicateById(data);
内容的提问来源于stack exchange,提问作者ddon
相关产品推荐
相关产品推荐

