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

Angular 8中如何根据嵌套对象的值过滤对象数组

问题:根据Region值过滤嵌套数组并返回对应父对象

需求描述

需要在getClusterByName()函数中根据传入的region值搜索对象数组,当传入'1UL Africa'、'New Test'或'South Africa'时,返回包含对应子对象的父对象,预期输出如下:

result = [
     {
        "name": "Africa",
        "children": [
          {
            "name": "Test1",
            "region": "1UL Africa"
          },
          {
            "name": "Test2",
            "region": "South Africa",
          },
          {
            "name": "Test3",
            "region": "New Test",
          }
        ]
      }
];

当前代码问题

当前代码直接对顶层数组过滤,但顶层对象没有region属性,region存在于children数组的子对象中,因此x.region === clusterName永远不成立,返回空数组:

changeRegion(){  
 this.newRegion = this.getClusterByName('South Africa');
}

getClusterByName(clusterName){
   this.data = [
      {
        "name": "Africa",
        "children": [
          {
            "name": "Test1",
            "region": "1UL Africa"
          },
          {
            "name": "Test2",
            "region": "South Africa",
          },
          {
            "name": "Test3",
            "region": "New Test",
          }
        ]
      },
      {
        "name": "Europe",
        "children": [
          {
            "name": "Test4",
            "region": "1UL Africa"
          },
          {
            "name": "Test5",
            "region": "Test Europe"
          }
        ]
      }
    ];    
    return this.data.filter(x => x.region === clusterName);
  };

修正后的实现

方案1:返回包含目标region子项的完整父对象

如果需求是只要父对象的children中存在匹配的region,就返回整个父对象(保留所有children),可以这样实现:

changeRegion(){  
 this.newRegion = this.getClusterByName('South Africa');
}

getClusterByName(clusterName){
   this.data = [
      {
        "name": "Africa",
        "children": [
          {
            "name": "Test1",
            "region": "1UL Africa"
          },
          {
            "name": "Test2",
            "region": "South Africa",
          },
          {
            "name": "Test3",
            "region": "New Test",
          }
        ]
      },
      {
        "name": "Europe",
        "children": [
          {
            "name": "Test4",
            "region": "1UL Africa"
          },
          {
            "name": "Test5",
            "region": "Test Europe"
          }
        ]
      }
    ];    
    // 过滤出children中存在匹配region的父对象
    return this.data.filter(parent => 
      parent.children.some(child => child.region === clusterName)
    );
  };

方案2:返回父对象且仅保留匹配region的子项

如果需求是返回父对象,同时children只保留匹配目标region的子项,可以这样实现:

changeRegion(){  
 this.newRegion = this.getClusterByName('South Africa');
}

getClusterByName(clusterName){
   this.data = [
      {
        "name": "Africa",
        "children": [
          {
            "name": "Test1",
            "region": "1UL Africa"
          },
          {
            "name": "Test2",
            "region": "South Africa",
          },
          {
            "name": "Test3",
            "region": "New Test",
          }
        ]
      },
      {
        "name": "Europe",
        "children": [
          {
            "name": "Test4",
            "region": "1UL Africa"
          },
          {
            "name": "Test5",
            "region": "Test Europe"
          }
        ]
      }
    ];    
    // 先处理children只保留匹配项,再过滤掉无匹配子项的父对象
    return this.data
      .map(parent => ({
        ...parent,
        children: parent.children.filter(child => child.region === clusterName)
      }))
      .filter(parent => parent.children.length > 0);
  };

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:30:32