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

嵌套数组中对象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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:25:38