You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:48:03