如何修复JavaScript按多条件联合过滤用户列表功能失效问题
多条件AND逻辑用户列表过滤方案
已知数据结构
- 待过滤用户列表
filterData结构:
filterData = [ { "position":"lawyer", "department_positions":[], "group_positions":[ {"group":{"id":2,"code":"234","name":"group1"},"lead":false}, {"group":{"id":1,"code":"123","name":"group12"},"lead":true} ] }, { "position":"director", "department_positions":[ {"department":{"id":3,"code":"333","name":"subDep"},"lead":false} ], "group_positions":[ {"group":{"id":2,"code":"234","name":"group1"},"lead":false}, {"group":{"id":1,"code":"123","name":"group12"},"lead":true} ] }, { "position":"director", "department_positions":[], "group_positions":[] } ]
- 筛选条件集合
categories结构:
categories = { "position":["lawyer","director"], "group_positions":["group1","group12"], "department_positions":["generalDep", "subDep"] }
现有问题
原有过滤代码仅支持OR逻辑,命中任意一个筛选维度就会返回结果,同时对字符串类型的position字段直接调用数组方法find会直接报错,无法满足多维度条件同时生效的AND筛选需求。
原有问题代码:
this.filter = this.filterData.filter(item => { for (let key in this.categories) { if (item[key].find(el => this.categories[key].includes( el.group?.name || el.department?.name ) )) { return true } } return false })
修改方案
AND逻辑的核心是所有配置了筛选值的维度必须全部命中,只要有一个维度不满足就排除当前用户,同时兼容不同字段的类型差异,修改后代码如下:
this.filter = this.filterData.filter(item => { // 遍历所有筛选维度,全部匹配才保留 for (let key in this.categories) { const conditionList = this.categories[key]; // 跳过未设置有效值的筛选条件 if (!Array.isArray(conditionList) || conditionList.length === 0) continue; let matchResult = false; // 单独处理字符串类型的position字段 if (key === 'position') { matchResult = conditionList.includes(item[key]); } else { // 处理数组类型的部门/用户组字段 matchResult = item[key].some(el => conditionList.includes(el.group?.name || el.department?.name) ); } // 任意一个维度不匹配直接排除当前用户 if (!matchResult) return false; } // 所有维度都匹配才保留 return true; })
按照示例筛选条件(position为director、group_positions包含group1、department_positions包含subDep)测试,最终仅会返回第二条用户数据,符合预期。
内容的提问来源于stack exchange,提问作者annn
相关产品推荐
相关产品推荐

