Возникла проблема с использованием Rx JS для усреднения массива переменных в Angular - PullRequest
0 голосов
/ 21 января 2020

У меня есть база данных Firestore, в которой есть поля, включающие в себя: day, morning, afternoon, night, с указанием времени дня c использования в течение этого времени. Я пытаюсь использовать этот код для усреднения значений morning et c, в день (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 / Rx JS, но я неудачно с треском. Буду очень признателен за любую помощь. Спасибо.

1 Ответ

1 голос
/ 21 января 2020

Попробуйте использовать 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()
  )
)
...