首页 > 解决方案 > 使用 RxJS 平均 Angular 中的变量数组时遇到问题

问题描述

我有一个 Firestore 数据库,其中包含以下字段:day, morning, afternoon, night, 一天中的时间是该时间段内的数字用法。我正在尝试使用此代码来平均等值morning,每天(sunday,,monday...)。

import { Subscriber, Observable, from } from 'rxjs';
import { map, filter, toArray, reduce, switchMap, groupBy } from 'rxjs/operators';
import * as _ from 'lodash';

...
groupedData: any = [];
meter:Observable<any>;
meterId: string;

ngOnInit() {
this.meter = this.db.collection('meters').doc(this.meterId).collection('data').valueChanges();

  from(this.meter)
      .groupBy(x => x.day)
      .flatMap(group => group.toArray())
      .map(g => {
        return {
          day: g[2].day, 
          morning: _.sumBy(g, 'morning'), 
          afternoon: _.sumBy(g, 'afternoon'), 
          night: _.sumBy(g, 'night'), 
        }
      })
      .toArray()
      .subscribe(d => this.groupedData = d);
}

我得到了错误Property 'groupBy' does not exist on type 'Observable<any>'.

我想我正试图从早期版本的 Angular/RxJS 代码中调整它,但失败得很惨。我真的很感激任何帮助。谢谢你。

标签: angulargoogle-cloud-firestorerxjs

解决方案


尝试使用pipe如下示例:

import { map } from 'rxjs/operators';
import { HttpClient } from '@angular/common/http';

export class MyComponent {
  constructor(private http: HttpClient) { }
  getItems() {
    this.http.get('https://example.com/api/items').pipe(map(data => {})).subscribe(result => {
      console.log(result);
    });
  }
}

您还可以将多个运算符链接为:

getItems()
.pipe(
  switchMap(users => from(users)),
  mergeMap(user => forkJoin(getAddresses(user.id), getCompanies(user.id))
                   .pipe(map(data => ({user, addresses: data[0], companies: data[1] })))
  tap(data => data.user.addresses = data.addresses),
  tap(data => data.user.companies = data.companies),
  map(data => data.user),
  toArray()
  )
)

推荐阅读