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

如何针对含动态属性数量的对象数组进行过滤?

通用员工数组过滤方案需求

我有一个包含布尔值和整数类型属性的员工对象数组:

let employees = [
  { isSkilled: false, isLeader: false, departmentHeadType: 0 },
  { isSkilled: true, isLeader: false, departmentHeadType: 1 },
  { isSkilled: true, isLeader: true, departmentHeadType: 2 }
];

用户通过勾选选择器中的任意选项组合来过滤上述员工数组,选择完成后会得到两种形式的过滤条件:

  • 单个值匹配:选中"Skilled""Leaders"和"Heads of departments"时,过滤条件为:
    var filter1 = { isSkilled: true, isLeader: true, departmentHeadType: 2 };
    
  • 多值匹配/属性省略:选中"Skilled""Newbie"(因此过滤条件中省略isSkilled属性,表示两种情况均可)、"Leaders""Heads of departments"和"Deputy heads of departments"时,过滤条件为:
    var filter2 = { isLeader: true, departmentHeadType: [1, 2] };
    

之前用JSON.stringify(filter1) == JSON.stringify(object)的方式,仅在被比较对象的属性数量、顺序完全一致时有效,且无法处理filter2这类场景——既无法应对属性省略的情况,也处理不了值为数组的多值匹配。目前用多个if分支针对特定属性过滤的方法代码冗余、扩展性差,当员工属性及过滤选项增加时难以维护,想找更优、更通用的解决方案。


通用过滤实现方案

可以编写一个通用的过滤函数,遍历过滤条件的每个属性,根据属性值的类型(单个值/数组)判断员工对象是否匹配,自动忽略过滤条件中未定义的属性:

function filterEmployees(employees, filter) {
  return employees.filter(employee => {
    // 遍历过滤条件的所有属性键值对
    for (const [key, condition] of Object.entries(filter)) {
      const employeeValue = employee[key];
      // 若条件是数组,检查员工对应属性值是否在数组范围内
      if (Array.isArray(condition)) {
        if (!condition.includes(employeeValue)) {
          return false;
        }
      } else {
        // 单个值直接做全等比较
        if (employeeValue !== condition) {
          return false;
        }
      }
    }
    // 所有过滤条件都满足则保留该员工
    return true;
  });
}

使用示例

  • 处理filter1的结果:
const result1 = filterEmployees(employees, filter1);
// 输出:[{ isSkilled: true, isLeader: true, departmentHeadType: 2 }]
  • 处理filter2的结果:
const result2 = filterEmployees(employees, filter2);
// 输出:[{ isSkilled: true, isLeader: true, departmentHeadType: 2 }]

扩展性说明

这个函数不需要针对特定属性写分支逻辑,后续无论新增多少员工属性(比如isFullTime、teamId等),只要过滤条件保持“单个值匹配”或“数组多值匹配”的结构,就能直接复用该函数,完全不需要修改过滤逻辑,维护成本极低。

内容的提问来源于stack exchange,提问作者bairog

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:17:19