如何将一些过滤器与恢复初始对象一起使用



我有对象this.fltUsers的数组。

下面我监听传入消息并对this.fltUsers进行过滤。

this.filterForm.controls["gender"].valueChanges.subscribe(selectedValue => {
this.requestLoadPersonal = this.fltUsers.filter((p: Personal) => {
return selectedValue ? p.gender == selectedValue : true;
});
});
this.filterForm.controls["position"].valueChanges.subscribe(
selectedValue => {
this.requestLoadPersonal = this.fltUsers.filter((p: Personal) => {
return selectedValue ? p.positionId == selectedValue : true;
});
}
);

其中this.requestLoadPersonal包含过滤后的数据。

如何将第一次过滤的结果传递给第二次?使条件AND介于两个filters之间?如何恢复初始对象?

也许我可以使用替代品,比如:

if (this.requestLoadPersonal !== this.fltUsers) {
// FILTER BY this.requestLoadPersonal
} else {
// FILTER BY this.fltUsers
}

似乎每次更改之前我都必须存储对象的语句,然后才能将其恢复到以前的语句。

我假设您使用的是rxjs。如果是这种情况,您可以使用rxjs运算符。也许可以看看这里的文档。

在你的情况下,这可能会做到:

const firstCondition = this.filterForm.controls["gender"].valueChanges.pipe(map(selectedValue => {
this.fltUsers.filter((p: Personal) => p.gender == selectedValue);
}));
const secondCondition = this.filterForm.controls["position"].valueChanges.pipe(map(
selectedValue => {
this.fltUsers.filter((p: Personal) => p.positionId == selectedValue);
}));
merge(firstCondition, secondCondition).pipe(reduce((acc, val) => acc && val), true);

我将两个可观察性映射到你的条件(pipemap(。然后,我可以使用merge创建一个包含两个值的可观察流,并将reduce最终转换为一个布尔值。

最新更新