Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何通过返回布尔值的可观测值的函数过滤数组中的可观测值_Javascript_Angular_Rxjs_Reactive Programming - Fatal编程技术网

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
将只发出一个元组数组(即用户与其解析的管理员状态配对)。接下来,您将更改后续的
过滤器
映射
运算符,使其与元组数组兼容,而不仅仅是元组。