如何过滤Observable数组?

fer*_*lde 5 observable firebase typescript angularfire firebase-realtime-database

在此输入图像描述

我的方法从Firebase返回一个Observable数组.我决定过滤客户端而不是服务器中的数据.我的问题是,如果属性"atte = true",我只想获取数据.任何帮助或其他方法都非常感谢.非常感谢你.

下面的方法从firebase实时数据库中获取数据

userEvents: Observable<any[]>;

getUserEvents(uid: string) {
this.userEvents = this.db.list(this.basePatheventsSaved, ref=> 
 ref.orderByChild('uid').equalTo(uid)).snapshotChanges().map((actions) => {
  return actions.map((a) => {
    const data = a.payload.val();
    const $key = a.payload.key;
    return { $key, ...data };
  });
});
return this.userEvents;
} 
Run Code Online (Sandbox Code Playgroud)

下面的代码用于确定templaTe中使用的数据:

 userEvents: Observable<any[]>;
 constructor(public auth: AuthService, private upSvc: FilesServiceService) { 
this.userEvents = this.upSvc.getUserEvents(this.auth.currentUserId);
 }
Run Code Online (Sandbox Code Playgroud)

Unc*_*ave 9

您应该能够使用mapfilter运算符,结合使用Array.prototype.filter.如果我已正确理解您的数据,它应该是这样的:

import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/map';

userEvents: Observable<any[]>;

constructor(public auth: AuthService, private upSvc: FilesServiceService) { 
  this.userEvents = this.upSvc.getUserEvents(this.auth.currentUserId)
    .map(items => items.filter(item => item.attending))
    .filter(items => items && items.length > 0);
}
Run Code Online (Sandbox Code Playgroud)

首先,我们将数组过滤到只有attendingtrue的项目.然后我们过滤掉任何空数组或空数组.

更新了RXJS 6:

import { pipe } from 'rxjs'; 
import { map, filter } from 'rxjs/operators';

userEvents: Observable<any[]>;

constructor(public auth: AuthService, private upSvc: FilesServiceService) { 
  this.userEvents = this.upSvc.getUserEvents(this.auth.currentUserId)
    .pipe(
      map(items => items.filter(item => item.attending)),
      filter(items => items && items.length > 0)
    );
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*sen 6

您不能为此使用rxjs筛选器方法,而应使用从可观察对象接收到的数组对象上的筛选器方法。

因此,如果您有一个Observable<any[]>,则可以像这样进行过滤:

import 'rxjs/add/operator/map';

this.userEvents.map( arr =>
           arr.filter( r => r.attending === true )
     )
     .subscribe( results => console.log('Filtered results:', results))
Run Code Online (Sandbox Code Playgroud)

从rxjs 5.5开始,您应该在Observable .pipe.map直接使用:

 import { map } from 'rxjs/operators';

 this.userEvents.pipe( 
         map(arr =>
           arr.filter( r => r.attending === true )
         )
     )
     .subscribe( results => console.log('Filtered results:', results))
Run Code Online (Sandbox Code Playgroud)