按键分组的反应式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”函数是关键。