2015-12-12 120 views
3

在Rx.js中,如何将数组流转换为数组流,例如我有以下流:['0a','0b'],['1a' “1B”],[“2A”,“2B”,“2C”]我想下面的流:将数组流转换为数组的流运算符

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

是否有做这样的事情,任何运营商,或者我应该写一个刮?

回答

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

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

你想达到什么是非常相似,这里所描述的那样:RXJS: alternately combine elements of streams

,提示两种方式:

  1. 使用Rx.Observable.zip运算符(把参数作为观测阵列和发射其索引n处的元素的流是第n个可观察到的第x个值)

    然而,在您的示例中应用的解决方案将在1a,1b处停止,因为由此产生的obse一旦观察结果完成,可行就会完成。

  2. 延长你的阵列通过虚拟值完成,并应用Rx.Observable.zip操作

在那些两个选项给他们所有的相同长度:

  • 如果去掉最后一行,.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.htmlhttps://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/zip.md