Ragnar921
Ragnar921

Reputation: 977

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

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?

Upvotes: 3

Views: 4525

Answers (3)

noririco
noririco

Reputation: 795

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

Also can be simplify with:

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

Upvotes: 5

Quang Nhật
Quang Nhật

Reputation: 51

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!

Upvotes: 0

AliF50
AliF50

Reputation: 18899

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,
  };
});

Upvotes: 1

Related Questions