如何展平 rxjs 中的嵌套数组

Posted

技术标签:

【中文标题】如何展平 rxjs 中的嵌套数组【英文标题】:how to flatten the nested array in rxjs 【发布时间】:2022-01-19 15:57:09 【问题描述】:

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

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);

游乐场链接:Rxjs stackblitz

预期输出:

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

【问题讨论】:

【参考方案1】:

你可以试试这个

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 类对象(实际上 mergeMap 以前称为flatMap) Array 被视为 Observable,因为它实际上可以表示数据流,这就是 Observable 的含义

【讨论】:

【参考方案2】:

如果您想要一个数字流,请 +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));
)

【讨论】:

以上是关于如何展平 rxjs 中的嵌套数组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pyspark 在 aws 胶水中展平嵌套 json 中的数组?

展平字典中的嵌套数组

如何在javascript中展平嵌套数组? [复制]

使用 jq 为 JSON 对象的嵌套数组中的属性展平数组

展平嵌套数组。 (爪哇)

在 BigQuery 上展平多个嵌套数组