Angular / Firestore Суммирует значения массива объектов внутри документа - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть документ в коллекции firestore с несколькими значениями ключей, один из которых является массивом объектов, и я хочу вычислить сумму всех значений ключевых «заказов» внутри массива «сессий» для этого идентификатора. .

{
      id: "asdSDWESHGawhadah",
      name: "John",
      lastName: "Doe",
      age: "20",
      sessions: [

        {
          orders: 1
          date: 2019 - 11 - 24
        },
        {
          orders: 5
          date: 2019 - 11 - 26
        },
        {
          orders: 4,
          date: 2019 - 11 - 29
        },
      ],
    }

Мне не удалось показать результат суммы (в данном случае 10) в HTML. Я попытался сделать это в машинописном тексте компонента, где я вызываю сервис, который дает мне документ, но переменная - Observable с моим Интерфейсом, поэтому я не могу использовать map или Reduce, я знаю, что есть способ с помощью Rx Js Я не могу найти хороший пример, чтобы понять его сложным для моих знаний. Есть ли простой способ получить сумму результата непосредственно из Firestore?

constructor(
private fbservice: FirebaseService,) {  }

  ngOnInit() {

        this.fbpatient$ = this.fbservice.getOnePatient(idPatient);  

  }
Метод getOnePatient приносит мне данные, которые содержат все сеансы со значениями, которые я хочу суммировать, но, как я уже сказал, я не могу работать с fbpatient $, как обычная javascript объектная причина Observable .

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Благодаря пользователю SnorreDan я придумал это решение, оно работает для меня, хотя я не знаю, является ли это лучшим способом или лучшей практикой. Затем я подписываюсь на HTML, как предложил SnorreDan, с {{mySumObservable $}}

let sum = 0;
    this.mySumObservable$ = this.fbservice.getOnePatient(idPatient).pipe(
      map((patient) => {
        patient.sessions.forEach((patient) => {
          sum = sum + patient.orders;
        });
        
        return sum;
      })
    ) as any;
0 голосов
/ 23 апреля 2020

Вы можете решить эту проблему, используя оператор карты RX JS, что-то вроде этого:

mySumObservable$ = this.fbservice.getOnePatient(idPatient).pipe(
  map(patient => {
    return patient.sessions.reduce((sum, session) => sum + session, 0);
  })
);

Затем вы можете получить сумму из mySumObservable $, подписавшись на нее в своем коде, что-то вроде:

mySumObservable$.subscribe(sum => this.patientSum = sum);

Или, подписавшись на канал asyn c в вашем html:

<div>{{ (mySumObservable$ | async) }}</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...