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

如何筛选Array 2中不存在于Array 1的id并保留对应嵌套结构?

解决嵌套数组的过滤需求

首先,我们明确核心需求:从Array 2的嵌套结构里,移除所有在Array 1中出现过的id对应的子项;如果某个分类下的子项被全部移除,就删掉整个分类项,最终保留符合条件的内容。

实现步骤拆解

  • 第一步:提取Array 1中所有的id,存入一个Set集合(Set的查找效率远高于数组,适合做重复值判断)。
  • 第二步:遍历Array 2的外层分类列表,对每个分类下的子列表进行过滤,只保留id不在Set里的项。
  • 第三步:过滤掉那些子列表为空的分类项,确保最终结果里没有空分类。

代码示例(JavaScript)

// 模拟输入的两个嵌套结构
const array1 = {"list":{"0":{"category":"Cat fr 1","list":{"0":{"id":123123123123},"1":{"id":123123123124}}}}};
const array2 = {"list":{"0":{"category":"Cat fr 1","list":{"0":{"id":123123123123},"1":{"id":123123123124}}},"1":{"category":"Cat fr 2","list":{"0":{"id":123123123125},"1":{"id":123123123126}}},"2":{"category":"Cat fr 3","list":{"0":{"id":123123123127},"1":{"id":123123123128}}}}};

// 1. 提取Array1中所有id存入Set
const existingIds = new Set();
Object.values(array1.list).forEach(category => {
  Object.values(category.list).forEach(item => {
    existingIds.add(item.id);
  });
});

// 2. 处理Array2,过滤符合条件的内容
const filteredResult = { list: {} };
let resultIdx = 0;

Object.values(array2.list).forEach(category => {
  // 过滤当前分类下不在Array1中的id项
  const validSubItems = Object.values(category.list).filter(item => !existingIds.has(item.id));
  
  // 只有当过滤后还有子项时,才保留这个分类
  if (validSubItems.length > 0) {
    // 把过滤后的子项转回原有的带索引的对象结构
    const subListObj = {};
    validSubItems.forEach((item, idx) => {
      subListObj[idx] = item;
    });
    
    filteredResult.list[resultIdx] = {
      category: category.category,
      list: subListObj
    };
    resultIdx++;
  }
});

console.log(filteredResult);

代码细节说明

  • 用Set存储id是为了优化查找性能,数据量越大,这个优势越明显。
  • 处理时先用Object.values把对象形式的列表转成数组,方便遍历和过滤;处理完成后再转回带索引的对象,保持和原输入一致的结构格式。
  • 最终结果会自动去掉所有子项被完全过滤的分类,和你给出的期望结果完全匹配。

内容的提问来源于stack exchange,提问作者Lộc Đặng Hữu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:26:34