【问题标题】:split observable array into two observable arrays将可观察数组拆分为两个可观察数组
【发布时间】:2019-02-25 08:38:43
【问题描述】:

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

{id:string, status:string}

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

我用谷歌搜索和 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 专家,在这一点上碰壁了,希望任何指点

【问题讨论】:

    标签: rxjs rxjs6


    【解决方案1】:

    您不是将项目返回给groupBy,而是将整个数组返回给groupBy。试试这个

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

    【讨论】:

      【解决方案2】:

      在我看来你的想法是正确的。使用分区似乎是正确的方法。但是分区现在真的很奇怪(很快就被弃用了更好的东西: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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-04
        • 2019-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-13
        • 2015-08-11
        • 2012-04-20
        相关资源
        最近更新 更多