我有一个数据流,例如以下值:
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}]
我可以使用map
和reduce
,但最后我会得到一张我必须以某种方式再次拆分的地图。在RxJs中有更直接的方式吗?
答案 0 :(得分:2)
您可以在reduce
运算符中执行数组map
。可能比groupBy
和flatMap
更清晰一些。这比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;
答案 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)
})