【问题标题】:How to filter an Observable array in angular based on a value如何根据值以角度过滤 Observable 数组
【发布时间】:2021-08-19 01:06:57
【问题描述】:

我正在请求一个 Web 服务并接收一个 observable 并循环它们以构建另一个对象数组,如下所示。

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

角度组件:

sellers: Observable<Seller[]>;

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

getSllers(){
    return this.sellers;
 }

使用这些卖家 Observable 即时创建对象数组。

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

在这里我想过滤掉只有isOnline true 的卖家。 sn-p im 似乎不起作用。最好的方法是什么?

【问题讨论】:

  • 您的地图回调有误。您没有对卖家调用的 Array.filter 方法返回的数组做任何事情。
  • 你能回答一下吗
  • 是selleers=sellers.filter(seller =&gt; seller.isOnline == true) - 数组的过滤器返回一个新的数组但不改变原来的数组-
  • @Eliseo 你能回答吗?

标签: angular filter rxjs observable


【解决方案1】:
getSellerDetails() {
    return this.getSllers().pipe(
        map(sellers => 
         sellers
         .filter(seller => seller.isOnline)
         .map(seller => {
            return {
                name: seller.name,
                isOnline: seller.isOnline,
                email: seller.email
            }
        })
    )); 
 }

您似乎没有使用卖家过滤结果进行映射。 试试这个!

【讨论】:

    【解决方案2】:
    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
                  }
               });
            })
          )
     }
    

    【讨论】:

      【解决方案3】:

      米克尔是对的。我想你的意思是:

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

      【讨论】:

        猜你喜欢
        • 2017-09-11
        • 2017-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-10
        • 2020-05-22
        • 2018-06-27
        相关资源
        最近更新 更多