Filter Operator谓词函数返回数组中的所有项

问题描述 投票:0回答:2

我有一个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))

enter image description here

第一个控制台日志位于过滤器函数内,第二个控制台日志位于subscribe方法中。

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

angular filter rxjs observable ngrx
2个回答
3
投票

rxjs过滤器函数用于过滤每个发射,因此如果这对阵列发射一次,则需要使用数组过滤器函数和map来代替

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))

0
投票

完整的rx替代方案是:

this.blog$ = this.store.select('posts', 'blogs').pipe(
  mergeAll(),
  filter(post => post.id == this.id)
).subscribe(post => console.log(post))
© www.soinside.com 2019 - 2024. All rights reserved.