Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 994
Ragnar921 Avatar asked May 13 '26 22:05

Ragnar921


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

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

like image 132
noririco Avatar answered May 16 '26 13:05

noririco


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,
  };
});
like image 21
AliF50 Avatar answered May 16 '26 12:05

AliF50