You need to enable JavaScript to run this app. Angular/TypeScript 如何在不修改原数组前提下过滤嵌套对象数组
优惠活动
大模型
产品
解决方案
定价
更多

Angular/TypeScript 如何在不修改原数组前提下过滤嵌套对象数组

问题根因

你的现有实现存在三个会导致数据被永久篡改的逻辑问题:

  • 直接对原rule对象的cfRequestDocumentComparison属性赋值,修改了堆内存中的原始对象,原始嵌套数组被永久替换为过滤后的结果,后续过滤无法获取全量数据
  • 外层filter的返回值是赋值运算的结果(即过滤后的子数组),空数组也是truthy值,会导致所有rule都被保留,哪怕不存在匹配当前文档对的条目
  • 每次过滤都基于上一次的过滤结果(this.rules)计算,而非原始全量数据,切换过滤条件时数据集会持续残缺
正确实现方案

核心思路是完全隔离原始数据,所有过滤操作基于独立的原始数据集生成全新的结果对象,绝不修改原始引用:

  1. 单独存储一份永不修改的全量rules备份,所有过滤操作都从这份备份启动
  2. 对每个rule生成全新的对象实例,仅替换过滤后的嵌套对比数组,不修改原对象
  3. 跳过没有任何匹配条目的rule,避免展示无效数据

完整代码

// 单独存储原始全量数据,全程不修改
private allRules: cfRequestRule[] = [];
// 绑定视图的rules变量,仅存储当前过滤后的结果
public rules: cfRequestRule[] = [];

// 初始化时做数据隔离
constructor() {
  // 用深拷贝完全切断和原始传入数据的引用关联
  this.allRules = structuredClone(rules);
  this.rules = [...this.allRules];
}

public filterByDocumentPair(documentPair: {
  sourceDocID: string | null,
  destinationDocID: string | null,
  sourceDocName: string,
  destinationDocName: string,
}) {
  // 每次都从原始全量数据开始计算,不依赖上一次的过滤结果
  this.rules = this.allRules
    .map(rule => {
      // 过滤当前rule下匹配文档对的对比条目,返回全新数组
      const matchedComparisons = rule.cfRequestDocumentComparison.filter(comparison => {
        // 兼容null值的匹配逻辑,避免严格相等判断的边界问题
        const isSourceMatch = documentPair.sourceDocID == null
          ? comparison.SourceDocumentID == null
          : comparison.SourceDocumentID === documentPair.sourceDocID;
        
        const isDestinationMatch = documentPair.destinationDocID == null
          ? comparison.DestinationDocumentID == null
          : comparison.DestinationDocumentID === documentPair.destinationDocID;

        return isSourceMatch && isDestinationMatch;
      });

      // 无匹配条目的rule直接丢弃
      if (matchedComparisons.length === 0) return null;

      // 生成全新的rule对象,不修改原引用
      return {
        ...rule,
        cfRequestDocumentComparison: matchedComparisons
      };
    })
    .filter(Boolean) as cfRequestRule[];
}

实现特性说明

  • 原始传入的rules数组全程不会被修改,深拷贝操作切断了嵌套对象的引用关联
  • 每次过滤都从全量数据重新计算,切换不同文档对时不会出现数据残缺
  • 严格匹配文档ID的null值场景,和你现有数据中DestinationDocumentID: null的结构完全兼容
  • 自动过滤掉没有任何匹配条目的rule,不会展示无效的空数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 01:54:02