如何将一系列日期绑定值映射/减少到 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
我需要 temp
和 hum
的 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 中的运行总数?的主要内容,如果未能解决你的问题,请参考以下文章