如何将Observable<Observable<any[]>[]>扁平化合并为去重的单一Observable数组
实现方案
你可以通过RxJS操作符组合完成转换,核心思路是先组合所有内部Observable的输出、扁平化数组、再按id去重,实现代码如下:
首先导入需要的RxJS依赖:
import { combineLatest } from 'rxjs'; import { switchMap, map } from 'rxjs/operators';
核心转换逻辑:
// 输入源:Observable<Observable<any[]>[]> const values: Observable<Observable<any[]>[]> = /* 你的输入源 */; // 转换后的结果:Observable<any[]> const result$ = values.pipe( // 1. 监听从外层流出的内部Observable数组,用combineLatest组合所有内部Observable的最新输出 switchMap(innerObservables => combineLatest(innerObservables)), // 2. 将多个数组合并为一维数组 map(emittedArrays => emittedArrays.flat()), // 3. 按id字段去重 map(flattenArray => { const idMap = new Map<number, any>(); flattenArray.forEach(item => { // 重复id默认保留先出现的条目,若需要保留后出现的可直接删除if判断 if (!idMap.has(item.id)) { idMap.set(item.id, item); } }); return Array.from(idMap.values()); }) );
可选调整说明
- 若你的内部Observable都是单次发射后立即完成的类型(比如HTTP请求),可以把
combineLatest替换为forkJoin,执行效率更高。 - 如果你需要严格按内部Observable的顺序处理发射值,可将
switchMap替换为concatMap,避免外层发射新的Observable数组时中断之前的处理。
内容的提问来源于stack exchange,提问作者Phibs
相关产品推荐
相关产品推荐

