如何展平 rxjs 中的嵌套数组

how to flatten the nested array in rxjs

我正在使用 forkJoin 订阅多个内部可观察对象。如何将嵌套数组扁平化为单级数组。

const x$ = of([1, 2, 3, 4]);
const y$ = of([2, 4]);

x$.pipe(
  switchMap((t) => {
    const innerArr$ = t.map((z) => y$.pipe(map((_) => _.map((y) => y * z))));
    return forkJoin(innerArr$);
  })
).subscribe(console.log);

游乐场Link:Rxjs stackblitz

预期输出:

[2,4,4,8,6,12,8,16]

你可以试试这个

x$.pipe(
  switchMap((t) => {
    const innerArr$ = t.map((z) => y$.pipe(map((_) => _.map((y) => y * z))));
    return forkJoin(innerArr$);
  }),
  mergeMap((aa) => from(aa).pipe(mergeMap((a) => a)))
).subscribe(console.log);

这里的关键是

  • mergeMap 实际上是一个展平的 Observable-like 对象(实际上 mergeMap 以前称为 flatMap)
  • 数组被视为 Observable,因为它实际上可以表示数据流,这就是 Observable

如果你想要一个数字流,+1 到@Picci 的答案。

如果您想改为使用单个数组结束,可以在订阅中展平结果:

x$.pipe(
  switchMap((t) => {
    const innerArr$ = t.map((z) => y$.pipe(map((_) => _.map((y) => y * z))));
    return forkJoin(innerArr$);
  })
)
.subscribe((res) => {
  console.log([].concat.apply([], res));
})