RXJS6-过滤对象数组

时间:2018-08-17 14:54:14

标签: rxjs

我将使用RXJS运算符filter过滤对象数组

我有一系列这样的对象:

    {
      id: string,
      count: number
    }

我会得到count > 20

的对象

我尝试过:

  getVotes2(): Observable<Vote> {
    return this._http.get<Vote>(url)
     .pipe(
       map( results => results ),
       filter( result => result.count>20 )
     );
  }

接下来,没有map,我总是会得到所有记录。

有什么想法吗?

---------正确的代码------------

getVotes2(): Observable<Vote[]> {
 return this._http.get<Vote[]>(url)
  .pipe(
    map( results => results.filter( r => r.count < 20) )
  )
}

2 个答案:

答案 0 :(得分:7)

您对使用rx过滤器运算符感到困惑。

filter rx运算符与数组filter运算符不同。 rx过滤器对流进行操作,并从流中排除满足条件的内容,数组过滤器运算符对数组进行操作,并根据条件从数组中删除项目。

您当前正在做的是在数组本身的一些未定义的“ count”属性上过滤流,因此您要说“如果未定义> 20,则让该项通过流”,以及其中一个怪癖的javascript,未定义的IS大于20。

您需要做的是这样

getVotes2(): Observable<Vote[]> {
 return this._http.get<Vote[]>(url)
  .pipe(
    map( results => results.filter(r => r.count > 20) )
  );
}

这样,您可以使用rx Map在流中的项目上执行操作,并在项目上使用数组过滤器来过滤数组。

编辑:如前所述,键入还必须正确,以使打字稿知道您期望的是投票对象数组而不是单个投票对象。

答案 1 :(得分:0)

如果您收到的http响应类似

{ 
  data: {
    results: [ {id: 'dd5144s', count: 14}, {id: 'dd51s4s', count: 22}, {id: 'dd5sa44s', count: 8}  ]
  }
}

然后尝试:

 return this._http.get<Vote>(url)
   .pipe(
     switchMap( results => results ),
     filter( result => result.count>20 )
   );

希望这会有所帮助。