RxJS: фильтровать содержимое в наблюдаемом, используя эмиссию другого наблюдаемого

#rxjs

#rxjs

Вопрос:

У меня есть Observable<Project> , который возвращает массив объектов. Мне нужно отфильтровать этот массив на основе Observable<boolean> построенного из запроса с использованием идентификаторов объектов.

Что-то в строках приведенного ниже кода, но мне нужны фактические объекты в массиве, а не массив логических значений, которые я в настоящее время сопоставил с ними. Я предполагаю, что что-то в строках zip-файла, которое я мог бы использовать после того, как исходное наблюдаемое было отправлено для объединения обоих значений, чтобы я мог использовать их в фильтре.

     this.projectService.getCurrentUserProjects().pipe(
      mergeAll(),
      mergeMap((project) => this.getProjectConditions(project.id)),
      filter((condition) => condition),
      toArray()
    )
  

Мои текущие выводы здесь:

  1. Способ для меня получить доступ к значениям, передаваемым mergeAll после слоя фильтра, для меня, чтобы собрать его в массив.
  2. Способ для меня сделать concatMap, который возвращает observable с обоими значениями, чтобы я мог использовать его на уровне фильтра.
  3. Какой-то оператор фильтра, который принимает наблюдаемое.

Ответ №1:

Рассмотрите возможность использования внутреннего map возвращающего оба значения (данные и условие) в виде массива, как показано ниже:

 this.projectService.getCurrentUserProjects().pipe(
  mergeAll(),
  mergeMap((project) => this.getProjectConditions(project.id).pipe(map(condition => [project, condition]))),
  filter(([,condition]) => condition), // <= only destruct second parameter 
  map(([project]) => project), // <= only destruct first parameter 
  toArray()
)