如何针对含动态属性数量的对象数组进行过滤?
通用员工数组过滤方案需求
我有一个包含布尔值和整数类型属性的员工对象数组:
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
相关产品推荐
相关产品推荐

