首页 > 解决方案 > 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)
      });
    }

你有更好的想法我怎么能做到这一点?

问候, 安德烈亚斯

标签: javascriptrxjs

解决方案


如果您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 中找到。


推荐阅读