Я не проверял это, но я думаю, что все должно быть в порядке:
combineLatest(values$, excluded$).pipe(
map(([values, excluded]) => {
// put all the excluded IDs into a map for better perfs
const excludedIds: Map<string, undefined> = excluded.reduce(
(acc: Map<string, undefined>, item) => {
acc.set(item.id, undefined)
return acc;
},
new Map()
);
// filter the array, by looking up if the current
// item.id is in the excluded list or not
return values.filter(item => !excludedIds.has(item.id))
})
)
Объяснение:
Используя combineLatest
, вы всегда будетебудьте предупреждены независимо от того, где вы получаете обновление.Если вы используете withLatestFrom
, как в вашем примере, оно будет запускать обновление, только если обновляется наблюдаемая values$
.Но если excluded$
изменится, это не приведет к обновлению в вашем случае.
Затем выведите все исключенные идентификаторы в карту вместо массива, поскольку нам нужно будет знать, должен ли данный идентификатор иметьбыть исключенным или нет.Просмотр карты намного быстрее, чем просмотр массива.
Затем просто отфильтруйте массив значений.