Reactive JS(RxJs)按键分组

时间:2018-03-19 11:45:14

标签: rxjs reactive-programming

我有一个数据流,例如以下值:

Observable.of(
    [{time: 1000, a: 100},
    {time: 1000, b: 100},
    {time: 2000, a: 200}]
);

需要根据time合并值以获取:

[{time: 1000, a: 100, b: 100},
{time: 2000, a: 200}]

我可以使用mapreduce,但最后我会得到一张我必须以某种方式再次拆分的地图。在RxJs中有更直接的方式吗?

2 个答案:

答案 0 :(得分:2)

您可以在reduce运算符中执行数组map。可能比groupByflatMap更清晰一些。这比rxjs问题更像是数据映射问题。



Rx.Observable.of(
	[{time: 1000, a: 100},
   {time: 1000, b: 100},
   {time: 2000, a: 200}]
).map(data => {
  return data.reduce((acc, cur) => {
    const index = acc.findIndex(x => x.time === cur.time);
    if (index >= 0) {
      acc[index] = { ...acc[index], ...cur };
    } else {
      acc.push(cur);
    }
    return acc;
  }, [])
})
.subscribe(x => { console.log('result', x); });

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.7/Rx.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

我最终得到了这个:

    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)
    })