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



我有一个可观察对象,它会发出带有键日期的测量值。类似于:

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

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

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

我该如何设计减速器?我对的替代方法持开放态度

类似的东西?

在这里,你每次都要重新计算总数。如果有更多的值,或者计算总数的计算成本很高,你可以保留一堆值,然后推/弹出以减去旧值并推送新值。对于总共7次的运行,只对每次排放进行重新计算会更快。

我把可观察到的变成空的,这样这个玩具示例就可以编译了。您需要提供一些数据,而不是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);

相关内容

最新更新