首页 > 解决方案 > 过滤运算符谓词函数返回数组中的所有项

问题描述

我有一个对象数组的 Observable。每个对象都有一个“id”属性。我使用 filter 方法的目的是只返回与特定 id 匹配的对象的 observable。

当我实现以下代码时,谓词函数返回整个数组。我的期望是只有一项通过。

    this.blog$ = this.store.select('posts', 'blogs').pipe(
      filter((post, index) => {
        console.log(post[index].id == this.id);
        return post[index].id == this.id
      }),
    ).subscribe(x=>console.log(x))

在此处输入图像描述

第一个控制台日志在过滤器函数内,第二个从 subscribe 方法调用。

如果我的比较器函数评估为真,仅针对某个 id,我怎样才能正确地只产生传递的对象?

标签: angularfilterrxjsobservablengrx

解决方案


rxjs 过滤器函数用于过滤每个发射,因此如果它使用数组发射一次,您将需要使用数组过滤器函数和映射来代替

this.blog$ = this.store.select('posts', 'blogs').pipe(
  map((posts) => posts.filter((post) => post.id == this.id))
).subscribe(x=>console.log(x))

或者,如果您只需要第一个匹配项,并且希望将结果作为对象而不是具有 1 个元素的数组,则只需使用find数组函数:

this.blog$ = this.store.select('posts', 'blogs').pipe(
  map((posts) => posts.find((post) => post.id == this.id))
).subscribe(x=>console.log(x))

推荐阅读