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

如何在TypeScript/Angular中过滤深层嵌套的PDO对象数组?

过滤深层嵌套PDO数组的实现

核心思路

要实现完整的嵌套过滤,需要分层处理每一层数据:

  1. 过滤出包含符合条件pdo_program的PDO
  2. 对每个符合条件的PDO,过滤其pdo_advocacies,仅保留包含有效pdo_program的项
  3. 对每个保留的pdo_advocacy,过滤其pdo_programs,仅保留匹配指定分类的项

类型定义(辅助理解)

interface AdminBeneficiaryCategory {
  category: string;
  // 其他属性可按需补充
}

interface PdoProgram {
  admin_beneficiary_category: AdminBeneficiaryCategory;
  // 其他属性可按需补充
}

interface PdoAdvocacy {
  pdo_programs: PdoProgram[];
  // 其他属性可按需补充
}

interface PDO {
  pdo_advocacies: PdoAdvocacy[];
  // 其他属性可按需补充
}

实现代码

// 提取目标分类集合,用Set提升查找效率
const targetCategories = new Set(selectedOptions.map(opt => opt.name));

const filterPDOs = (pdos: PDO[]): PDO[] => {
  return pdos.map(pdo => {
    // 过滤当前PDO下的pdo_advocacies
    const filteredAdvocacies = pdo.pdo_advocacies
      .map(advocacy => {
        // 过滤当前advocacy下的pdo_programs
        const filteredPrograms = advocacy.pdo_programs.filter(program => 
          targetCategories.has(program.admin_beneficiary_category.category)
        );
        // 仅保留包含有效program的advocacy
        return filteredPrograms.length > 0 ? { ...advocacy, pdo_programs: filteredPrograms } : null;
      })
      .filter(advocacy => advocacy !== null); // 移除无有效program的advocacy

    // 仅保留包含有效advocacy的PDO
    return filteredAdvocacies.length > 0 ? { ...pdo, pdo_advocacies: filteredAdvocacies } : null;
  }).filter(pdo => pdo !== null); // 移除无有效advocacy的PDO
};

// 使用示例
const filteredTableData = filterPDOs(tableData);

代码说明

  • 不可变处理:使用扩展运算符...复制对象,避免修改原数组数据
  • 分层过滤逻辑:从最内层的pdo_programs开始过滤,逐层向上筛选有效父级数据
  • 空值过滤:每一层处理后都移除无有效子项的对象,确保最终结果仅包含完全符合条件的嵌套结构

验证示例

假设输入数据:

const tableData: PDO[] = [
  {
    id: 1,
    pdo_advocacies: [
      {
        id: 101,
        pdo_programs: [
          { admin_beneficiary_category: { category: "Children" } },
          { admin_beneficiary_category: { category: "Adults" } }
        ]
      },
      {
        id: 102,
        pdo_programs: [
          { admin_beneficiary_category: { category: "Adults" } }
        ]
      }
    ]
  },
  {
    id: 2,
    pdo_advocacies: [
      {
        id: 201,
        pdo_programs: [
          { admin_beneficiary_category: { category: "Adults" } }
        ]
      }
    ]
  }
];

const selectedOptions = [{ id: 2, name: "Children" }];

过滤后输出:

[
  {
    id: 1,
    pdo_advocacies: [
      {
        id: 101,
        pdo_programs: [
          { admin_beneficiary_category: { category: "Children" } }
        ]
      }
    ]
  }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:12:50