angular - Angular Form RxJS 在一个表单输入上进行多重过滤
问题描述
我有以下要过滤的对象数组
companies = [
{
division: "Company 1",
departments: ["Department 1", "Department 2", "Department 3"]
},
{
division: "Company 2",
departments: ["Department 2", "Department 3", "Department 4"]
},
{
division: "Company 3",
departments: ["Department 3", "Department 4", "Department 5"]
}
...
]
我可以使用单个表单输入上的值更改订阅来过滤除法。
this.myForm.valueChanges.pipe(
debounceTime(400),
distinctUntilChanged(),
tap(val => {
let searchTerm = val.searchString;
this.filteredDivisions = this.companies.filter((company) =>
company.division
.toLowerCase()
.indexOf(searchTerm.toLowerCase()) !== -1)
})
).subscribe()
我被要求根据一个输入过滤部门和部门数组。因此,如果用户键入Department 1
,则只会显示公司 1,但用户也可以Company 1
在相同的输入框中键入,然后也只会显示公司 1。用户应该能够键入部门或部门来过滤数组。
那么如何设置过滤器以同时过滤部门和部门,使用相同的输入?
解决方案
好吧,您只需要稍微扩大将与给定字符串匹配的字段
this.myForm.valueChanges
.pipe(
debounceTime(400),
distinctUntilChanged(),
tap(val => {
let searchTerm = val.searchString.toLowerCase();
this.filteredDivisions = this.companies.filter(company => {
// filter against the 'division' property
const divisionMatch =
company.division.toLowerCase().indexOf(searchTerm) !== -1;
// filter against the 'departments' property
const departmentsMatch = () =>
company.departments.find(
department => department.toLowerCase().indexOf(searchTerm) !== -1,
);
// If divisionMatch is true, no need to check further, return true
return divisionMatch || departmentsMatch();
});
}),
)
.subscribe()
我把你的注意力集中在departmentsMatch
一个函数上,而不是一个简单的值,这允许惰性求值。如果division
匹配,则departmentsMatch
永远不会调用。
推荐阅读
- android - Google STS TradeFed 失败并出现错误:无法运行命令:com.android.tradefed.config.ConfigurationException:找不到本地配置 sts
- html - jQuery: .wrapAll 围绕多个重复的元素
- excel - 关闭excel文件时的Excel sumifs #value
- python - Discord.py 当我尝试向 JSON 文件发送自定义前缀时出现此错误:期望值:第 1 行第 1 列(字符 0)
- arrays - 排序后如何在C中保留未排序的数组
- html - 没有javascript的最高内部div的外部div高度
- python - 类型错误:“布尔”对象不可调用
- python - 添加/相乘向量和矩阵时如何创建新维度?(Python 和 NumPy)
- javascript - 是的,多条件验证
- include - Sequelize : 具有 where 条件的范围不适用于单数和复数