我有对象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);
我将两个可观察性映射到你的条件(pipe
和map
(。然后,我可以使用merge
创建一个包含两个值的可观察流,并将reduce
最终转换为一个布尔值。