数组流到流运算符数组

时间:2015-12-12 05:06:39

标签: rxjs frp bacon.js kefir.js

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

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

是否有任何操作员可以做这样的事情,或者我应该从头开始写一个?

2 个答案:

答案 0 :(得分:2)

这样的事情应该有效

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

答案 1 :(得分:0)

您可以使用现有的操作员相对轻松地实现它。

您想要达到的目标与此处描述的内容非常相似:RXJS: alternately combine elements of streams

它提出了两种方式:

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

    但是,在您的示例中应用的解决方案将停在1a,1b,因为只要其中一个observable完成,结果observable就会完成。

  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是您想要的流,即值为{{的流1}}

    有关(Ia,Ib...)运营商>的文档http://reactivex.io/documentation/operators/zip.html https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/zip.md