将可观察数组拆分为两个可观察数组

时间:2018-09-21 00:56:44

标签: rxjs rxjs6

我有一个api调用,它使用Observable<User[]>返回数据(用户是

{id:string, status:string}

我想根据状态(活动/不活动)将可观察对象分为两个不同的可观察对象

我用Google搜索和Stackoverflowed,但是我能找到的唯一样本仅显示了单值数组[1,2,3,4]

我试图将相同的技术应用于对象数组

const foo = this.userApi
        .find()
        .pipe(partition(item => item.status === 'active'));

希望这将返回foo[0]持有有效用户和foo[1]持有无效用户

但是,vsCode编辑器抱怨

[ts]
Argument of type 'UnaryFunction<Observable<User[]>, [Observable<User[]>, Observable<User[]>]>' is not assignable to parameter of type 'OperatorFunction<any, any>'.
  Type '[Observable<User[]>, Observable<User[]>]' is not assignable to type 'Observable<any>'.
    Property '_isScalar' is missing in type '[Observable<User[]>, Observable<User[]>]'.
[ts] Property 'status' does not exist on type 'User[]'.
any

这意味着item是一个数组...

我也尝试过groupBy并遇到了相同的问题

const foo = this.userApi
        .find<User>()
        .pipe(groupBy(item => item.status));

[ts] Property 'status' does not exist on type 'User[]'

您可能会说,我不是rxjs专家,并且在这一点上碰壁了,不胜感激任何指针

2 个答案:

答案 0 :(得分:0)

您不是要返回项目,而是将整个数组返回到groupby。试试这个

  const foo = this.userApi
        .find<User>()
        .pipe(mergeMap(users=>from(users),
             groupBy(item => item.status));

答案 1 :(得分:0)

我认为您有正确的想法。使用分区似乎是正确的方法。但是分区现在真的很奇怪(不久就被淘汰了,它提供了更好的东西:splitBy,请参见此处以获取更多信息:https://github.com/ReactiveX/rxjs/issues/3807)。

无论如何,这里是使用分区的方法:

const [activeUsers$, inactiveUsers$]: [Observable<User>, Observable<User>] =
  partition(
    (x: User) => x.status === 'active'
  )(from(mockUsers));

此处的Stackblitz示例:https://stackblitz.com/edit/typescript-ziafpr

另请参阅https://github.com/ReactiveX/rxjs/issues/2995