rxjs filter
оператор фильтра значений в потоке (ваш массив представляет собой одно значение в потоке), в вашем случае вам не нужно фильтровать значения в потоке, вам нужен map
массив значений для конкретного значения по идентификатору .
this.invoices$ = this.invCollection.snapshotChanges().pipe(
map(actions =>
actions.map(action =>
({
key: action.payload.doc.id,
...action.payload.doc.data()
})
)
)
)
если вам нужно создать поток с элементом по определенному идентификатору:
getInvoiseById(id): Observable<InvoiceType> {
return this.invoices$.pipe(
map(invoices =>
invoices.filter(({key}) => key === id)))
)
}
если вам нужно создать поток с активным счетом, лучше создать поток с активным идентификатором и объединить его с потоком счета
activeId$ = new Subject<TypeOfIdField>();
activeInvoice$ = combineLatest([
this.invoices$,
this.activeId$
]).pipe(
map(([invoices, id]) =>
invoices.find(({key}) => key === id)
)
)
setActiveId(id) {
this.activeId$.next(id);
}
Примечание: если вы хотите использовать shareReplay
, лучше переместите его в конец конвейера, в своем коде вы сначала кэшируете свои исходные данные, а после этого отображаете их в используемый формат, в этом случае вы преобразуете данные для каждой подписки. , если вы перемещаете shareReplay
в конец конвейера, вы кэшируете уже преобразованные данные