Angular如何从一对多关联两张表获取嵌套对象数组 合并两个http.get Observable
实现思路
你需要先拉取全量的itemsClass分类列表,再对每个分类并行查询对应的itemType数据,组装成符合要求的Item对象后,合并为数组返回即可,核心是用forkJoin批量处理多个Observable。
完整实现代码
首先先修正你接口定义里的笔误(itemcClassId多写了一个c,调整为itemClassId),完整代码如下:
// 基础类型定义 interface ItemClass { id: any; name: any; } interface ItemType { // 按你后端实际返回的字段调整,只要能拿到类型值即可 value: any; } interface Item{ itemClassId: any; itemClassName: any; itemTypeValue?: any; itemTypeValues?: any[]; } // 对外暴露的获取Item数组的方法 getAllItems(): Observable<Item[]> { // 第一步:调用接口拉取所有分类列表 return this.http.get<ItemClass[]>('替换为你获取全量itemsClass的接口地址').pipe( switchMap((itemClasses: ItemClass[]) => { // 为每个分类生成对应的Item组装Observable const itemTaskList: Observable<Item>[] = itemClasses.map(itemClass => { // 查询当前分类关联的所有itemType return this.http.get<ItemType[]>(`替换为你查询itemType的接口地址?classId=${itemClass.id}`).pipe( map((itemTypes: ItemType[]) => { const typeValueList = itemTypes.map(item => item.value); const baseItem = { itemClassId: itemClass.id, itemClassName: itemClass.name }; // 按规则赋值单值/多值字段 if (typeValueList.length === 1) { return {...baseItem, itemTypeValue: typeValueList[0]}; } else if (typeValueList.length > 1) { return {...baseItem, itemTypeValues: typeValueList}; } // 无关联类型的场景直接返回基础字段 return baseItem; }) ) }); // 合并所有单个Item的请求,统一返回数组 return forkJoin(itemTaskList); }) ) }
注意事项
- 如果你的分类数量较多,这种实现会产生N+1次HTTP请求(1次查全部分类+N次查每个分类的类型),性能较差。建议优先和后端协商,新增一个接口直接返回关联后的完整数据,前端只需要一次请求即可拿到结果。
- 如果你不需要全量分类数据,只要指定部分分类的结果,可以把第一步的全量查询替换成你需要的分类数组即可。
内容的提问来源于stack exchange,提问作者Nik Rubblers
相关产品推荐
相关产品推荐

