【问题标题】:How do I create an Observable array which is the result of averaging mapped arrays如何创建一个 Observable 数组,它是平均映射数组的结果
【发布时间】:2020-01-09 18:04:30
【问题描述】:

我正在尝试计算这个名为 meterdata 的集合的每小时平均值,其中集合中的每个文档都有一个名为 hourlyarray 的数组,其长度为 24。

此代码 sn-p 映射 [0] 所有 hourlyarrays 并将它们平均在一起形成一个数字。

它写得很好,但只是平均排名第一。有没有一种简单的方法可以在我的 component.ts 上以编程方式创建一个 Observable 来运行 24 次,然后将所有结果一起批处理到一个数组中?

this.avg0 = collectionRef.collection('meterdata', 
ref=> ref.where("day", "==", day )).valueChanges()
.pipe((map(data => data.map(d => d.hourlyarray[0])
.reduce((acc, avg) => acc + avg, 0)/data.length)));

相关:在客户端做这个计算是不是很聪明?

【问题讨论】:

    标签: angular google-cloud-firestore angularfire2


    【解决方案1】:

    如果我正确理解您的意图,.pipe(switchMap(data => from(data)), map(arrayofdata => arrayofdata.reduce(...))) 应该可以工作。简而言之,它将您的 hourlyarray 转换为 Observable 并在该数组中的所有元素之间应用归约。

    【讨论】:

    • 它似乎不起作用 - 除非我没有正确实施它。 this.avg = collectionRef.collection('meterdata', ref=> ref.where("day", "==", day )).valueChanges().pipe(switchMap(data => from(data.hourlyarray), reduce(...))); 导致错误 Expression expected.,如果我插入我的 reduce() 部分,我会得到 Property 'hourlyarray' does not exist on type 'DocumentData[]'。我是否将此代码附加到我已有的代码中?谢谢。
    • @EzraButler,我修正了错字;重试。
    • this.avg = collectionRef.collection('meterdata', ref=> ref.where("day", "==", day )).valueChanges().pipe(switchMap(data => from(data.hourlyarray)), reduce(...)); 这仍然会导致ERROR in src/app/archive/archive.component.ts(137,135): error TS2339: Property 'hourlyarray' does not exist on type 'DocumentData[]'. src/app/archive/archive.component.ts(137,150): error TS2304: Cannot find name 'reduce'.
    • @EzraButler,它说data 实际上是数组本身。所以只需摆脱hourlyarray。您必须将数组传递到 from 才能将其转换为 Observable
    • 我知道数据是一个数组。我有 20 个数组,每个数组的长度都是 24,我想创建一个长度为 24 的数组,这是原始 20 个数组的平均值。
    猜你喜欢
    • 2020-10-02
    • 2021-12-24
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多