如何在TypeScript/Angular中过滤深层嵌套的PDO对象数组?
过滤深层嵌套PDO数组的实现
核心思路
要实现完整的嵌套过滤,需要分层处理每一层数据:
- 过滤出包含符合条件
pdo_program的PDO - 对每个符合条件的PDO,过滤其
pdo_advocacies,仅保留包含有效pdo_program的项 - 对每个保留的
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
相关产品推荐
相关产品推荐

