【问题标题】:RXJS How to convert Observable<T[]> to Observable<T>RXJS 如何将 Observable<T[]> 转换为 Observable<T>
【发布时间】:2016-07-01 08:29:01
【问题描述】:

我想获取 Observable 并将其转换为 Observable 以便 Observable 中的每个数组都被分解,然后发出数组的各个元素,分别通过 Observable.

是否有执行此操作的标准运算符?我四处寻找,但没有找到任何东西。谢谢。


在被指向concatMap/flatMap的方向后,我想出了以下通用解决方案:

var source: Observable<T[]>;
...
var splitSource = source.flatMap<T>((x:T[]) => { return Rx.Observable.fromArray(x); });

【问题讨论】:

  • 不,您描述的没有隐式功能。你需要自己写。这应该很容易做到 - 只需遍历数组即可。
  • 该死!好吧,实施起来应该不难。谢谢。如果您将其作为回复而不是评论提交,我会将其标记为答案
  • 也许有人提出了更好的解决方案——也许图书馆里有一些你最终可以使用的东西。

标签: javascript rxjs rxjs5


【解决方案1】:

你可以像这样使用concatMap

function identity (x) {return x}

var obs_of_array$ = Rx.Observable.return(['1','2','you got it'])
    .concatMap(identity)

这是因为concatMap 也接受数组(以及可观察对象和承诺)作为您作为参数传递的函数选择器的返回值。 jsbinhere,文档here

所以作为参数传递的数组成为选择器函数的返回值,然后在尊重数组顺序的情况下被concatMap 运算符展平。

【讨论】:

  • 这是一个有趣的方法,感谢 jsfiddle 上的示例。我将在 TypeScript 中使用它。我更喜欢更直接的东西,但我总是可以为此创建一个包装器
  • 在玩了它和 flatMap 之后,我发现这对我的情况很有效 - 谢谢
【解决方案2】:

我也一直在尝试将Observable&lt;T[]&gt; 转换为Observable&lt;T&gt;

我发现 flatMap() 自己完成了这项工作,我认为 11 个月前问这个问题时情况并非如此。

为了说明,在 @user3743222 的答案中的 jsfiddle 中,您可以进行此更改并获得相同的输出:

//.concatMap(identity)
.flatMap(theArray=>theArray)

我使用它和toArray() 运算符在管道中执行集合操作,例如对可观察对象进行排序。

    let sorted$ = source$.toArray().flatMap(theList=> theList.sort(this.myComparer) )

输出为Observable&lt;T&gt;。 (注意在固定数组的上下文中工作,不确定连续生成的源会发生什么)

【讨论】:

  • 这应该是对@user3743222 答案的评论,而不是新答案
猜你喜欢
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
相关资源
最近更新 更多