javascript - RXJS 积累
问题描述
我从蓝牙设备接收历史帧,我想重新计算每一帧的历史。
我可以拥有那种历史对象:
{
value1: [
{ date: new Date(), value: 45}
{ date: new Date(), value: 40}
],
value2: [
{ date: new Date(), value: true}
{ date: new Date(), value: false}
]
}
现在有时我会收到新数据作为示例
{
value1: [
{ date: new Date(), value: 60}
],
}
我想得到
{
value1: [
{ date: new Date(), value: 60}
{ date: new Date(), value: 45}
{ date: new Date(), value: 40}
],
value2: [
{ date: new Date(), value: true}
{ date: new Date(), value: false}
]
}
我是从写这个开始的,但我不确定是否已经没有一个运算符......</p>
RX.pipe(
filter(frame => FrameTypes[frame.FrameType] === FrameTypes.HIST),
scan((acc, val) => {
// Merge data by hand (not done already)
}, historyFromDatabase),
).subscribe(fullHistory => {
console.log(fullHistory);
// Update history to only keep values from the last two weeks
const newHistory = cleanOldData(2, history)
// Now save new history to database with previous and new values.
saveHistory(newHistory)
});
}
你有更好的想法我怎么能做到这一点?
问候, 安德烈亚斯
解决方案
如果您Observable
是有限的(可以在此处找到解释),您可以使用groupBy
运算符按属性分组。
例如:
source$
.pipe(
mergeMap(history => Object.entries(history)),
groupBy(([key]) => key),
mergeMap(group => {
return zip(
of(group.key),
group.pipe(
mergeMap(([_, values]) => values),
toArray()
)
);
}),
toArray(),
map(entries => Object.fromEntries(entries))
)
.subscribe(fullHistory => console.log(fullHistory));
你的传入历史在哪里source$
,完整的源代码可以在这个stackblitz 中找到。
推荐阅读
- ms-office - Office add-in - Manifest requirement section not reflected in supported platforms
- javascript - React Apex Line Chart Multiple Series
- c# - Deploying ASP.NET Core MVC web application on AWS causes SQL Server exception
- ruby - 如何检查数组中的位置并比较两个字段的颜色?[棋]
- amazon-web-services - Is there a way to use AWS CodePipeline to conditionally deploy from GitHub based on the existence of a Git tag?
- azure - 如何仅使用 terraform 将 azure 磁盘从一个位置复制到另一个位置
- git - 你可以手动设置 Jenkins currentBuild.changeSets 吗?
- javascript - Javascript 解码 JSON 中的 unicode 反斜杠
- php - Laravel 将大量数据推送到队列
- java - 掷骰子项目:代码给出低于 7 的越界异常并且未能保存第一个“骰子编号”