【发布时间】:2020-09-10 08:08:20
【问题描述】:
我正在尝试使用一系列过滤器过滤可观察的产品,但我真的不知道如何..
让我解释一下,我想将过滤结果设置为过滤产品。 对于过滤,对于每个过滤器,我必须检查产品的过滤器数组是否包含过滤器的名称,以及产品值数组是否包含过滤器 ID。
目前,过滤器有效,但仅适用于最后选择的过滤器,我想用我的 selectedFilters 数组中的所有过滤器过滤产品列表。我可以有一个或多个过滤器。
export class ProductsFilterComponent extends BaseComponent implements OnInit {
@Select(FiltersState.getAllFilters) filters$: Observable<any>;
@Input() products$: Observable<Product[]>;
filteredProducts$: Observable<Product[]>;
public selectedFilters = [];
constructor(
private store: Store) { super(); }
ngOnInit() {
this.store.dispatch(new GetAllFilters());
}
private filterProducts() {
this.filteredProducts$ = this.products$.pipe(
map(
productsArr => productsArr.filter(
p =>
p.filters.some(f => this.selectedFilters.some(([selectedF]) => selectedF === f.name.toLowerCase()) // Filter name
&& f.values.some(value => this.selectedFilters.some(([, filterId]) => filterId === value)) // Filter id
)
)
)
);
this.filteredProducts$.subscribe(res => console.log('filtered:', res));
}
}
提前非常感谢您:-)。
【问题讨论】:
-
你能创建一个最小的可重现的 sn-p 吗?即 StackBlitz。以便人们更好地理解您的问题
-
如果您使用的是ngrx,听起来应该有一些像
filteredProducts这样的状态,它同时使用商店中的产品和过滤器。 -
@SupunDeSilva 感谢您对我的问题感兴趣。当然,这是我的代码:-)
-
好吧,如果可能,添加
GetAllFilters和FiltersState的声明。因此,如果有问题,更容易发现。此外,您还有BaseComponent不确定它是否与问题相关。总而言之,让其他用户更容易找到问题,而无需做出假设。
标签: angular filter rxjs observable rxjs-pipeable-operators