代码之家  ›  专栏  ›  技术社区  ›  stwissel

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

  •  0
  • stwissel  · 技术社区  · 3 年前

    我有一个 observable 它发出带有密钥日期的测量值。类似于:

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

    我需要7天的跑步总成绩和平均成绩 temp hum 。如果我每周都有一个值,我可以写:

    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
    

    我该如何设计减速器? 我对其他方法持开放态度

    0 回复  |  直到 3 年前
        1
  •  3
  •   Mrk Sef    3 年前

    像这样的东西?

    在这里,你每次都要重新计算总数。如果有更多的值,或者计算总数的计算成本很高,您可以保留一堆值,然后推/弹出以减去旧值并推送新值。对于总共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);