Вы можете попробовать что-то вроде этого
.pipe(
switchMap(
items => from(items).pipe(
mergeMap(item => item.isSelected$.pipe(map(sel => ({sel, item})))),
filter(data => data.sel),
map(data => ({id: data.item.id})),
toArray()
)
),
)
Сначала мы берем уведомление о items$
, которое является массивом, и преобразуем его в наблюдаемый объект, который испускает один элемент за раз.
Ключ в функции передается в качестве параметра mergeMap
.
item.isSelected
возвращает Observable<boolean>
, который будет использоваться для фильтрации. К такой наблюдаемой мы применяем преобразование через map
, чтобы превратить его в объект, который имеет 2 свойства: критерии выбора и весь элемент.
Остальное - просто фильтрация на основе критериев выбора, а затем преобразование снова, чтобы получить item
.
Я протестировал приведенный выше код со следующими данными теста
const items$ = of(
[
{id: 1, isSelected$: of(true)},
{id: 2, isSelected$: of(false)},
{id: 3, isSelected$: of(true)},
{id: 4, isSelected$: of(true)},
],
[
{id: 10, isSelected$: of(true)},
{id: 20, isSelected$: of(true)},
{id: 30, isSelected$: of(false)},
{id: 40, isSelected$: of(false)},
]
);