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

Angular中如何对已reduce分组的对象数组进行多层嵌套分组?

多层嵌套分组实现方案

问题场景

从API获取如下格式的数据:

[ {
  "branchNumber" : "025",
  "lineOfBusiness" : "DC-M",
  "taskType" : "Advice",
  "role" : "LU",
  "priority" : "2"
}, {
  "branchNumber" : "null",
  "lineOfBusiness" : "DC-M",
  "taskType" : "Advice",
  "role" : "LU",
  "priority" : "2"
} ]

当前已通过reduce()实现按taskType分组的逻辑,代码如下:

export class BranchDetailsComponent implements OnInit {
    
    public dataList = [];
    public groupedData = [];
    public errorMessage;
    public branchNumber;

    constructor(private _dataService: DataService, private _route: ActivatedRoute) {}

    ngOnInit(): void { 
        let stringValue = this._route.snapshot.paramMap.get('stringValue');
        this.branchNumber = stringValue;
        this._dataService.getData(this.branchNumber).subscribe(
            data => {
                this.dataList = data;
                this.groupedData = this.groupByTask(this.dataList);
            },
            error => this.errorMessage = error);
    }
    groupByTask(data) {
        let grouped = [];
        return grouped = data.reduce((groupedTasks, element) => {
            const taskType = element.taskType;
            if (groupedTasks[taskType] == null) {
                groupedTasks[taskType] = [];
            }
            groupedTasks[taskType].push(element);
            return groupedTasks;
        }, []);
    }
}

现在需要实现多层嵌套分组:每个taskType分组下,先按branchNumber分组,再在每个branchNumber分组下按lineOfBusiness分组,最终得到taskType -> branchNumber -> lineOfBusiness -> 数据列表的嵌套结构。

实现方案

可以通过嵌套判断逻辑在一次reduce中完成多层分组,直接修改分组函数即可实现需求:

修改后的完整代码

export class BranchDetailsComponent implements OnInit {
    
    public dataList = [];
    public groupedData = {}; // 改用对象存储嵌套分组结构,更符合键值对层级逻辑
    public errorMessage;
    public branchNumber;

    constructor(private _dataService: DataService, private _route: ActivatedRoute) {}

    ngOnInit(): void { 
        let stringValue = this._route.snapshot.paramMap.get('stringValue');
        this.branchNumber = stringValue;
        this._dataService.getData(this.branchNumber).subscribe(
            data => {
                this.dataList = data;
                this.groupedData = this.groupMultiLevel(data);
            },
            error => this.errorMessage = error);
    }

    groupMultiLevel(data: any[]) {
        return data.reduce((result, item) => {
            // 第一层:按taskType创建分组
            const taskType = item.taskType;
            if (!result[taskType]) {
                result[taskType] = {};
            }

            // 第二层:在taskType分组下按branchNumber创建子分组
            const branchNumber = item.branchNumber;
            if (!result[taskType][branchNumber]) {
                result[taskType][branchNumber] = {};
            }

            // 第三层:在branchNumber分组下按lineOfBusiness创建子分组
            const lineOfBusiness = item.lineOfBusiness;
            if (!result[taskType][branchNumber][lineOfBusiness]) {
                result[taskType][branchNumber][lineOfBusiness] = [];
            }

            // 将当前数据项推入对应层级的数组
            result[taskType][branchNumber][lineOfBusiness].push(item);
            return result;
        }, {});
    }
}

结构说明

最终得到的嵌套结构示例如下,层级清晰且便于后续渲染或业务逻辑处理:

{
  "Advice": {
    "025": {
      "DC-M": [
        { "branchNumber": "025", "lineOfBusiness": "DC-M", "taskType": "Advice", "role": "LU", "priority": "2" }
      ]
    },
    "null": {
      "DC-M": [
        { "branchNumber": "null", "lineOfBusiness": "DC-M", "taskType": "Advice", "role": "LU", "priority": "2" }
      ]
    }
  }
}

可选优化:通用多层分组函数

如果后续需要灵活调整分组层级顺序或新增层级,可以封装一个通用分组函数,适配任意层级的分组需求:

// 通用分组函数:按传入的key数组顺序逐层分组
groupByLevels(data: any[], keys: string[]) {
    return keys.reduce((acc, key) => {
        const grouped = {};
        Object.values(acc).forEach(items => {
            (items as any[]).forEach(item => {
                const groupKey = item[key];
                if (!grouped[groupKey]) {
                    grouped[groupKey] = [];
                }
                grouped[groupKey].push(item);
            });
        });
        return grouped;
    }, [data]);
}

// 使用方式:按taskType -> branchNumber -> lineOfBusiness的顺序分组
this.groupedData = this.groupByLevels(this.dataList, ['taskType', 'branchNumber', 'lineOfBusiness']);

这个通用函数可以通过修改keys数组快速调整分组规则,适合动态业务场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:15:33