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

Angular8中如何按buSubRegion分组重组JSON对象

问题

需要根据子节点中的buSubRegion字段对给定的响应数据及其子节点进行分组重组,具体要求如下:

  • 在子节点所在的父级对象外部添加buSubRegion字段,值与子节点的该字段一致
  • 所有buSubRegion值相同的子节点,无论来自哪个原始父对象,都合并到同一个数组中
  • 不含buSubRegion字段的子节点(如示例中的Agbara - Savoury)不纳入处理

输入数据:

const data = [
    {
      "name": "Africa",  
      "id":1,    
      "children": [
        {
          "name": "Agbara - Laundry",
          "buSubRegion": "1UL Africa", 
          "children": [
            {
              'lineId':"R_D005_TPKDST02"
            }
        ]        
         
        },
        {
          "name": "Agbara - Savoury",         
          "children": [
            {
              "lineId":"R_D005_TPKDST02"
            }
        ] 
        }
      ]
    },
    {
        "name": "Europe",  
        "id":2,    
        "children": [
          {
            "name": "Europe1",
            "buSubRegion": "1UL Africa",
            "children": [
                {
                  "lineId":"R_D005_TPKDST02"
                }
            ]            
          },
          {
            "name": "Europe2",
            "buSubRegion": "Test Europe",
            "children": [
                {
                  "lineId":"R_D005_TPKDST02"
                }
            ] 
          }
        ]
      },
      {
        "name": "Latem", 
        "id":3,     
        "children": [
          {
            "name": "test1",
            "buSubRegion": "latem1",
            "children": [
                {
                  "lineId":"R_D005_TPKDST02"
                }
            ]           
          }
        ]
      }
  ];

期望输出:

[
    {      
      "buSubRegion": "1UL Africa", 
      "name": "Africa",
      "id":1,     
      "children": [
        {
          "name": "Agbara - Laundry",
          "buSubRegion": "1UL Africa",
          "children": [
              {
                "lineId":"R_D005_TPKDST02"
              }
          ] 
        },       
        {
            "name": "Europe1",
            "buSubRegion": "1UL Africa",
            "children": [
                {
                  "lineId":"R_D005_TPKDST02"
                }
            ]            
        }      
      ]
    },
    {        
        "buSubRegion": "Test Europe",
        "name": "Europe", 
        "id":2,  
        "children": [         
          {
            "name": "Europe2",
            "buSubRegion": "Test Europe",
            "children": [
                {
                  "lineId":"R_D005_TPKDST02"
                }
            ] 
          }
        ]
    },
    {
        "name": "Latem", 
        "buSubRegion": "latem1",
        "id":3,     
        "children": [
          {
            "name": "test1",
            "buSubRegion": "latem1",
            "children": [
                {
                  "lineId":"R_D005_TPKDST02"
                }
            ]            
          }
        ]
      }
  ];
解决方案

可以通过以下步骤实现需求:

  1. 遍历原始数据,收集所有带有buSubRegion字段的子节点,同时记录它们所属的父对象信息
  2. 以buSubRegion值为键,对子节点进行分组
  3. 为每个分组创建对应的父级对象,将同组的子节点合并到该对象的children数组中,同时在父级对象上添加buSubRegion字段

具体实现代码如下:

function groupByBuSubRegion(data) {
    // 用Map存储分组,键是buSubRegion值,值是包含父信息和子节点的对象
    const groups = new Map();

    data.forEach(parent => {
        // 过滤出带有buSubRegion的子节点
        const validChildren = parent.children.filter(child => 'buSubRegion' in child);
        
        validChildren.forEach(child => {
            const region = child.buSubRegion;
            if (!groups.has(region)) {
                // 首次遇到该区域,创建分组对象,复用第一个父对象的name和id
                groups.set(region, {
                    buSubRegion: region,
                    name: parent.name,
                    id: parent.id,
                    children: []
                });
            }
            // 将子节点添加到对应分组的children中
            groups.get(region).children.push(child);
        });
    });

    // 将Map转换为数组返回
    return Array.from(groups.values());
}

// 调用函数处理数据
const result = groupByBuSubRegion(data);
console.log(JSON.stringify(result, null, 2));

代码说明:

  • 使用Map高效管理分组,避免重复创建同一区域的父对象
  • 过滤掉无buSubRegion字段的子节点,符合需求要求
  • 同一区域的子节点会合并到同一个父对象的children数组中,父对象的name和id取自第一个遇到该区域的原始父对象(与示例输出一致)
  • 最终将Map的值转换为数组,得到期望的结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:50:28