如何更优地过滤含固定条件与动态条件的对象数组以避免代码重复
如何更优地过滤含固定条件与动态条件的对象数组以避免代码重复
嘿,我太懂你这种不想一遍遍复制粘贴过滤代码的烦恼了!针对你给出的对象数组场景,咱们可以通过封装通用过滤逻辑的方式,彻底解决代码重复的问题,不管是固定条件还是动态变化的过滤需求,都能轻松复用。
先把你的示例数组贴出来方便参考:
const arr = [ { "no": 11145, "stringers": "P1", "ribs": "R1", "description": "some text" }, { "no": 14568, "stringers": "P1", "ribs": "R1", "description": "some text" }, { "no": 24562, "stringers": "P2", "ribs": "R9", "description": "some text" }, { "no": 658741, "stringers": "P1", "ribs": "R2", "description": "some text" }, { "no": 325690, "stringers": "P4", "ribs": "R5", "description": "some text" }, { "no": 9745201, "stringers": "P1", "ribs": "R2", "description": "some text" } ];
方案1:封装键值对匹配的通用过滤函数
如果你的过滤需求大多是“匹配某个字段的固定值/可选值列表”,可以写一个接收条件对象的通用函数:
function filterArray(arr, filters) { return arr.filter(item => { // 遍历所有传入的过滤条件,确保每一项都匹配 return Object.keys(filters).every(key => { // 支持单个值匹配,也支持多值列表匹配 if (Array.isArray(filters[key])) { return filters[key].includes(item[key]); } return item[key] === filters[key]; }); }); }
调用示例:
- 过滤
stringers为P1且ribs为R1的项:
const result1 = filterArray(arr, { stringers: "P1", ribs: "R1" });
- 过滤
stringers为P1或P2的项:
const result2 = filterArray(arr, { stringers: ["P1", "P2"] });
方案2:支持自定义复杂条件的通用函数
如果需要更灵活的过滤逻辑(比如数值范围、模糊匹配等),可以让函数接收一个自定义判断函数:
function filterWithCustomLogic(arr, conditionFn) { return arr.filter(conditionFn); }
调用示例:
- 过滤
no大于100000的项:
const result3 = filterWithCustomLogic(arr, item => item.no > 100000);
方案3:结合两种方式的终极灵活版
要是你想同时兼顾固定键值匹配和自定义逻辑,可以把两种方案结合起来:
function flexibleFilter(arr, filters = {}, customCondition = () => true) { return arr.filter(item => { // 先匹配键值对条件 const matchesFilters = Object.keys(filters).every(key => { if (Array.isArray(filters[key])) { return filters[key].includes(item[key]); } return item[key] === filters[key]; }); // 再叠加自定义条件 return matchesFilters && customCondition(item); }); }
调用示例:
- 过滤
stringers为P1且no大于10000的项:
const result4 = flexibleFilter(arr, { stringers: "P1" }, item => item.no > 10000);
这样一来,不管后续有什么新的过滤需求,你只需要传入对应的条件参数就行,再也不用重复写filter的核心逻辑啦!
备注:内容来源于stack exchange,提问作者Sebbo85
相关产品推荐
相关产品推荐

