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" } ] } ] } ];
解决方案
可以通过以下步骤实现需求:
- 遍历原始数据,收集所有带有
buSubRegion字段的子节点,同时记录它们所属的父对象信息 - 以
buSubRegion值为键,对子节点进行分组 - 为每个分组创建对应的父级对象,将同组的子节点合并到该对象的
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
相关产品推荐
相关产品推荐

