How to filter an Observable array in angular based on a value

Viewed 627

Im requesting a web service and receiving an observable and loop them to build another array of objects like below.

export interface Seller {
  email?:String;
  isOnline?:boolean;
  name?:String;
}

Angular Component :

sellers: Observable<Seller[]>;

constructor(firestore: AngularFirestore) {
    this.sellers = firestore.collection('sellers').valueChanges();
 }

getSllers(){
    return this.sellers;
 }

Using these sellers Observable im creating an array of objects.

getSellerDetails() {
    return this.getSllers().pipe(
        map(sellers => {
        sellers.filter(seller => seller.isOnline == true)
         return sellers.map(seller => {
            return {
                name: seller.name,
                isOnline: seller.isOnline,
                email: seller.email
            }
        });
    })); 
 }

And here i want to filter out the sellers only who are having isOnline true. The snippet im having seems not working. What would be the best approach?

3 Answers
getSellerDetails() {
    return this.getSllers().pipe(
        // Filter only sellers that isOnline
        map(sellers => sellers.filter(seller => seller.isOnline == true)),
        // Map all filtered sellers to the wanted interface
        map(sellers => {
            return sellers.map(seller => {
              return {
                name: seller.name,
                isOnline: seller.isOnline,
                email: seller.email
              }
           });
        })
      )
 }

Mikkel is right. I think you mean to do:

return sellers
 // filter the array
 .filter(selller => seller.isOnline === true)
 // map the filtered array
 .map(seller => {
  return {
    name: seller.name,
    isOnline: seller.isOnline,
    email: seller.email,
  };
});
getSellerDetails() {
    return this.getSllers().pipe(
        map(sellers => 
         sellers
         .filter(seller => seller.isOnline)
         .map(seller => {
            return {
                name: seller.name,
                isOnline: seller.isOnline,
                email: seller.email
            }
        })
    )); 
 }

It looks like you didn't use seller filter result for mapping. Try this!

Related