数组流转换为流运算符数组

Stream of arrays into array of streams operator

在 Rx.js 中,如何将数组流转换为流数组,例如我有以下流:['0a','0b'], ['1a','1b' ],['2a','2b','2c'] 我想获取以下流:

0a---1a---2a--->
0b---1b---2b--->
          2c--->

是否有任何运算符可以做类似的事情,或者我应该从头开始写一个?

您可以使用现有的运算符相对轻松地实现它。

您想要实现的与此处描述的非常相似:

它建议两种方式:

  1. 使用 Rx.Observable.zip 运算符(将一个可观察对象数组作为参数并发出一个数组流,其索引 n 处的元素是第 n 个可观察对象发出的第 x 个值)

    然而,在您的示例中应用的该解决方案将在 1a,1b 处停止,因为一旦其中一个可观察对象完成,生成的可观察对象就会完成。

  2. 通过使用虚拟值完成并应用 Rx.Observable.zip 运算符

  3. 来扩展您的数组,使它们具有相同的长度

在这两个选项中:

  • 如果你删除最后一行,.concatMap.... 你会得到一个像 [0a,0b], [1a,1b], [2a,2b,2c] 这样的数组流,你可以从中轻松地按索引映射(.map(function(array){return array[N];}) 会得到你 [Na,Nb...]) 获取你想要的流。
  • 或者您可以保留完全相同的代码并添加 .filter(function(value,index){return index % N == I}),其中 N 是流的数量,I 是您想要的流,即具有值的流(Ia,Ib...)

关于 zip 运算符的文档 > http://reactivex.io/documentation/operators/zip.html https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/zip.md

像这样的东西应该可以工作

stream.
  flatMap(array =>
    Rx.Observable.from(
      array.map((obj, i) => {index: i, ...obj})
    )
  ).groupBy(x => x.index, ).
  subscribe(x =>
    x.map((x,i) => subscribe(x))
  )