如何将一系列日期绑定值映射/减少到 JavaScript / RXJS 中的运行总数?

Posted

技术标签:

【中文标题】如何将一系列日期绑定值映射/减少到 JavaScript / RXJS 中的运行总数?【英文标题】:How to Map/reduce a series of date bound values to a running total in JavaScript / RXJS? 【发布时间】:2022-01-05 02:15:55 【问题描述】:

我有一个observable,它发出带有键日期的测量值。比如:

  "date" : "2021-11-01",
   "temp" : 23.4,
   "hum"  : 74.5
 

我需要 temphum 的 7 天总数和平均值。如果我每周都有一个值,我可以这样写:

const weeklyReducer = (accumulator, currentValue, index) => 
   const key = Math.floor((index-1)/7);
   const workValue = accumulator[key] || key, temp: 0, hum:0;
   workValue.temp = workValue.temp + currentValue.temp;
   workValue.hum = workValue.hum + currentValue.hum;
   accumulator[key] = workValue;
   return accumulator;

但是我需要一个累计值,如下所示:

Running total 1: 1
Running total 2: 1,2
...
Running total 7:  1,2,3,4,5,6,7
Running total 8:  2,3,4,5,6,7,8
Running total 9:  3,4,5,6,7,8,9
Running total 10: 4,5,6,7,8,9,10

我将如何为此设计减速器? 我对替代方法持开放态度

【问题讨论】:

【参考方案1】:

这样的?

在这里您每次都重新计算总数。如果有更多值或计算总计的计算量很大,您可以保留一堆值并推送/弹出以减去旧值并推送新值。对于总共 7 个,只用每次发射重新计算会更快。

我将 observable 设为空,以便编译这个玩具示例。您需要提供一些数据而不是 EMPTY 流。

interface measurement 
  date : string,
  temp : number,
  hum  : number


let measurements$: Observable<measurement> = EMPTY;
measurements$.pipe(
  scan((acc, curr) => [...acc.slice(-6), curr], [] as measurement[]),
  map(measurements => (
    runningDates: measurements.map((date) => date),
    totalTemp: measurements.reduce((acc,temp) => acc + temp, 0),
    totalHum: measurements.reduce((acc,hum) => acc + hum, 0),
  ))
).subscribe(console.log);

【讨论】:

以上是关于如何将一系列日期绑定值映射/减少到 JavaScript / RXJS 中的运行总数?的主要内容,如果未能解决你的问题,请参考以下文章

将一组值映射到百分比

如何将一系列记录转换为 SQL 中该范围之后的记录值?

如何使用jquery datepicker将一天添加到日期

将一系列字符串转换为日期[重复]

我们如何将日期字段绑定到具有 2 列的“值列表”组合框?

如何将一列的列值组合到 MySQL 中的另一列中?