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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 18:45:01