按键分组的反应式JS(RxJs)
我有一个数据流,例如具有以下值:按键分组的反应式JS(RxJs),rxjs,reactive-programming,Rxjs,Reactive Programming,我有一个数据流,例如具有以下值: Observable.of( [{time: 1000, a: 100}, {time: 1000, b: 100}, {time: 2000, a: 200}] ); 需要根据时间合并这些值,以获得: [{time: 1000, a: 100, b: 100}, {time: 2000, a: 200}] 我可以使用map和reduce,但最后我得到了一个单独的map,我不得不以某种方式再次拆分。RxJs中还有更直接的方法吗?我最终
Observable.of(
[{time: 1000, a: 100},
{time: 1000, b: 100},
{time: 2000, a: 200}]
);
需要根据时间
合并这些值,以获得:
[{time: 1000, a: 100, b: 100},
{time: 2000, a: 200}]
我可以使用map
和reduce
,但最后我得到了一个单独的map,我不得不以某种方式再次拆分。RxJs中还有更直接的方法吗?我最终得到了这个结论:
Observable.of(
[{time: 1000, channelKey: 'a', value: 100},
{time: 1000, channelKey: 'b',value: 100},
{time: 2000, channelKey: 'a', value: 200}]
)
.flatMap<any[], any>(x => x)
.groupBy(v => Math.floor(v.time.getTime() / 1000), v => {
return {[v.channelKey]: v.value}
})
.flatMap((group$) => group$.reduce((acc, cur) => Object.assign(cur, acc), {time: group$.key}))
.toArray()
.subscribe((v) => {
console.log("Value: ", v)
})
可观察的(
[{time:1000,channelKey:'a',value:100},
{time:1000,channelKey:'b',value:100},
{时间:2000,channelKey:'a',值:200}]
)
.flatMap(x=>x)
.groupBy(v=>Math.floor(v.time.getTime()/1000),v=>{
返回{[v.channelKey]:v.value}
})
.flatMap((组$)=>group$.reduce((acc,cur)=>Object.assign(cur,acc),{time:group$.key}))
.toArray()
.认购((v)=>{
console.log(“值:”,v)
})
我最终得到了这个:
Observable.of(
[{time: 1000, channelKey: 'a', value: 100},
{time: 1000, channelKey: 'b',value: 100},
{time: 2000, channelKey: 'a', value: 200}]
)
.flatMap<any[], any>(x => x)
.groupBy(v => Math.floor(v.time.getTime() / 1000), v => {
return {[v.channelKey]: v.value}
})
.flatMap((group$) => group$.reduce((acc, cur) => Object.assign(cur, acc), {time: group$.key}))
.toArray()
.subscribe((v) => {
console.log("Value: ", v)
})
可观察的(
[{time:1000,channelKey:'a',value:100},
{time:1000,channelKey:'b',value:100},
{时间:2000,channelKey:'a',值:200}]
)
.flatMap(x=>x)
.groupBy(v=>Math.floor(v.time.getTime()/1000),v=>{
返回{[v.channelKey]:v.value}
})
.flatMap((组$)=>group$.reduce((acc,cur)=>Object.assign(cur,acc),{time:group$.key}))
.toArray()
.认购((v)=>{
console.log(“值:”,v)
})
您可以在
映射
操作符内部执行数组减少
。可能比groupBy
和flatMap
更清晰一些。这更像是一个数据映射问题,而不是rxjs问题
Rx.Observable.of(
[{time:1000,a:100},
{时间:1000,b:100},
{时间:2000,a:200}]
).map(数据=>{
返回数据。减少((acc,cur)=>{
const index=acc.findIndex(x=>x.time==cur.time);
如果(索引>=0){
acc[index]={…acc[index],…cur};
}否则{
acc.push(当前);
}
返回acc;
}, [])
})
.subscribe(x=>{console.log('result',x);})代码>
您可以在映射
操作符内部执行数组减少
。可能比groupBy
和flatMap
更清晰一些。这更像是一个数据映射问题,而不是rxjs问题
Rx.Observable.of(
[{time:1000,a:100},
{时间:1000,b:100},
{时间:2000,a:200}]
).map(数据=>{
返回数据。减少((acc,cur)=>{
const index=acc.findIndex(x=>x.time==cur.time);
如果(索引>=0){
acc[index]={…acc[index],…cur};
}否则{
acc.push(当前);
}
返回acc;
}, [])
})
.subscribe(x=>{console.log('result',x);})代码>
您需要为此使用RxJs吗?如果是,那么您是要为每个发射发射当前聚合,还是等待完成?你能展示一下你已经用map
和reduce
尝试了什么,以及你不喜欢的结果吗?还有,它会用同一个键求和值吗?对于使用同一个键的值,我可以选择“随机”一个,因为我不希望这样。我之所以使用RxJs,是因为我从HttpClient获取数据作为可观察的形式。我的实际结构与问题中的略有不同,但我在下面的回答中对此进行了阐述。找到“groupBy”函数是关键。你需要使用RxJs吗?如果是,那么您是要为每个发射发射当前聚合,还是等待完成?你能展示一下你已经用map
和reduce
尝试了什么,以及你不喜欢的结果吗?还有,它会用同一个键求和值吗?对于使用同一个键的值,我可以选择“随机”一个,因为我不希望这样。我之所以使用RxJs,是因为我从HttpClient获取数据作为可观察的形式。我的实际结构与问题中的略有不同,但我在下面的回答中对此进行了阐述。找到“groupBy”函数是关键。