我有一个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专家,并且在这一点上碰壁了,不胜感激任何指针
答案 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