Javascript 如何通过返回布尔值的可观测值的函数过滤数组中的可观测值
假设我有一个名为Javascript 如何通过返回布尔值的可观测值的函数过滤数组中的可观测值,javascript,angular,rxjs,reactive-programming,Javascript,Angular,Rxjs,Reactive Programming,假设我有一个名为selectedUsers$的可观察对象,它返回的可观察对象是以下格式的数组 [ { 'userId': 'someId', 'other': 'properties', 'that': 'dont', 'matter': '.', }, { 'userId': 'anotherId', 'other': 'properties', 'that': 'dont', 'matter': '.', }, { 'userI
selectedUsers$
的可观察对象,它返回的可观察对象是以下格式的数组
[
{
'userId': 'someId',
'other': 'properties',
'that': 'dont',
'matter': '.',
},
{
'userId': 'anotherId',
'other': 'properties',
'that': 'dont',
'matter': '.',
},
{
'userId': 'yetAnotherId',
'other': 'properties',
'that': 'dont',
'matter': '.',
},
];
我希望根据用户是否是模块的管理员来筛选此阵列,并仅收集非管理员的阵列。要获取用户是否是模块管理员,必须调用另一个函数,该函数接受moduleName
和userId
值,并返回true或false作为可观察值
函数的签名是
isUserAdministratorForModule$(moduleName: string, userId: string): Observable<boolean>
isUserAdministratorFormModule$(moduleName:string,userId:string):可观察
我想创建的函数是
getNonAdministratorUsersForModule$(moduleName: string): Observable<IUser[]> {
return this.selectedUsers$.map(selectedUsers => selectedUsers.map(user =>
user.id)
.filter(userId => !this.userService.isUserAdministratorForModule$(moduleName, userId))
}
getNonAdministratorUsersForModule$(moduleName:string):可观察{
返回此.selectedUsers$.map(selectedUsers=>selectedUsers.map(user=>
用户id)
.filter(userId=>!this.userService.isUserAdministratorForModule$(moduleName,userId))
}
这就是我想到的。它是错误的,但我写了它,所以你会有更好的想法。问题是过滤器是一个数组方法,其中的函数返回一个布尔值的可观察值
关于如何过滤返回数组的可观察对象,以及过滤器中传递的函数根据数组中对象的值返回true或false的可观察对象,有什么想法吗
谢谢看起来您在代码片段中使用的是RxJS 5.0,但这里有一个可能的RxJS 6.0解决方案 你应该可以改装这个 需要指出的方面:
接受返回的最新用户集合switchMap()
- 必须为每个用户调用
,这意味着您最终会得到isUserAdministratorForModule
Observable[]
- 将(用户)的
与
forkJoin()一起使用
然后将可观察到的每个用户结果值收集回单个流中merge()
- 最后,组合使用
和filter()
可以清除感兴趣的用户map()
const{forkJoin,merge,of}=rxjs;
const{filter,map,switchMap}=rxjs.operators;
常量selectedUsers=[
{
“userId”:“someId”,
“其他”:“属性”,
‘那’:‘不要’,
"物质":",,
},
{
“userId”:“anotherId”,
“其他”:“属性”,
‘那’:‘不要’,
"物质":",,
},
{
'userId':'yetAnotherId',
“其他”:“属性”,
‘那’:‘不要’,
"物质":",,
},
];
函数isUserAdministratorFormModule(模块名,用户ID){
返回(userId=='someId');
}
函数getNonAdministratorUsersForModule(moduleName){
返回(选定用户)。管道(
开关映射(用户=>
合并(…users.map(user=>
分叉连接(
属于(用户),
isUserAdministratorFormModule(moduleName,user.userId))
),
),
),
过滤器(([user,isAdmin])=>!isAdmin),
映射(([user,isAdmin])=>user),
);
}
getNonAdministratorUsersForModule().subscribe(console.log);
嘿,Miqh,这是一个很好的解决方案。我想知道,你是否可以返回一个用户数组,而不是观察到的单个用户的多个发射?你是否可以将它们捆绑到一个用户数组?@WimdenHerder,你绝对可以。一种方法是从更改合并(…users.map(…)开始
,到forkJoin(users.map(…)
。外部forkJoin
确保所有内部forkJoin
操作都已解析,并且switchMap
将只发出一个元组数组(即用户与其解析的管理员状态配对)。接下来,您将更改后续的过滤器
和映射
运算符,使其与元组数组兼容,而不仅仅是元组。