Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 将两个不同类别的两个不同观测值分组rxjs_Javascript_Typescript_Rxjs - Fatal编程技术网

Javascript 将两个不同类别的两个不同观测值分组rxjs

Javascript 将两个不同类别的两个不同观测值分组rxjs,javascript,typescript,rxjs,Javascript,Typescript,Rxjs,我有两个可观测到的发射两个不同类别的数据: 1.用户类别: { "id"=>25, "username"=>"Chris", .. other data } 2.UserWebsocket类 { "user_id"=>25, "age"=>25, .. other data } 我想通过user_id或id属性来合并和分组这两个观察值。因此,合并和分组类型的结果是: [User|undefined,UserWebsocket|

我有两个可观测到的发射两个不同类别的数据:

1.用户类别:

{
"id"=>25,
"username"=>"Chris",
.. other data 
}
2.UserWebsocket类

 {
     "user_id"=>25,
     "age"=>25,
      .. other data 
  }
我想通过user_id或id属性来合并和分组这两个观察值。因此,合并和分组类型的结果是:

[User|undefined,UserWebsocket|undefined]
为了进一步说明这个问题,我制作了一个简单的大理石图:


这是如何发生的?

正如martin的评论所建议的,使用CombineTest并为每个零件设置一个起始值。假设您有
myUser$
myUserWebsocket$
可观察对象,您可以使用以下代码将它们组合起来。首先,添加一个起始值,并将观察值存储在新值中。将它们与
combinelateest
组合。您必须订阅uncold的
组合$
可观

更新

另一种方法是使用
merge
并将其与
withLatestFrom
组合

//使用rxjsv6+
从“rxjs”导入{merge};
从'rxjs/operators'导入{startWith,map,withLatestFrom};
//名为myUser$和myUserWebsocket的allready定义的可观察对象$
//添加一个起始值,因为若用户激发,websocket还并没有值。
const user$=myUser$.pipe(
startWith(未定义)
)
const userWebsocket$=myUserWebsocket$.pipe(
startWith(未定义)
)
const combled$=合并(
用户$,
userWebsocket$
).烟斗(
withLatestFrom(用户$),
withLatestFrom(userWebsocket$),
map(([[merge,latestUser],latestWebsocket])=>{
如果(merge.user\u id){//merge是userWebsocket的类型,请确保用户没有user\u id属性
if(latestUser&&merge.user_id===latestUser.id){
返回[最新用户,合并];
}否则{
返回[未定义,合并];
}
}else如果(merge.id&!merge.user_id){//merge是用户的类型
if(latestWebsocket&&merge.id===latestWebsocket.user\u id){
返回[合并,最新的WebSocket];
}否则{
返回[合并,未定义];
}
}
})
);
合并的$.subscribe([用户,websocket]=>{
console.log(用户,websocket);
});

看起来您可以直接使用
CombineTest
。可能在每个可观察到的源之前使用
startWith(未定义)
。@martin问题是CombineTest不会按用户id或id对它们进行分组。那么您希望得到什么输出?@martin组合用户和用户WebSocket的数组。但是用户和UserWebsocket应该根据用户id和id进行组合。User.id==UserWebsocket.User\u id。否则,将未组合的对象与未定义的对象配对。@JasemAl Yafie感谢您的回答。我关心的是CombineTest如何通过user_id或id属性对它们进行分组。因为CombineTest可能会在不考虑用户id和id是否相等的情况下组合它们。我要求的是,如果user_id==id(参见第二个结果),则将它们组合起来,否则将未组合的对象与未定义的对应对象(参见第一个和最后一个结果)编辑我的答案。看一看。