如何在数组中多键搜索并动态生成OR过滤规则?
嘿,我明白你想要的是一个能动态生成OR过滤规则的函数,不用每次加新属性都重写逻辑对吧?这其实比你想的简单,不用递归也能搞定,咱们一步步来。
动态生成OR规则的数组过滤方案
核心思路
把过滤规则封装成一个灵活的配置对象:键是要检查的属性名,值是该属性需要匹配的候选值数组。然后对数组里的每个对象,只要它在任意一个属性上匹配到候选值,就保留这个对象——这就实现了动态的OR逻辑,完全不用硬写条件。
具体实现代码
// 示例对象数组 const myArray = [ { name: "Alice", age: 25, city: "Paris" }, { name: "Bob", age: 30, city: "London" }, { name: "Charlie", age: 25, city: "Paris" }, { name: "Diana", age: 35, city: "New York" } ]; // 动态OR过滤函数 function filterWithDynamicOR(array, filterRules) { return array.filter(item => { // 遍历所有过滤规则,只要有一个规则匹配就留下当前对象 return Object.entries(filterRules).some(([key, values]) => { // 检查当前对象的目标属性是否在候选值数组中 return values.includes(item[key]); }); }); }
怎么用这个函数?
比如你想过滤出age是25 或者 city是"London"的元素,直接传规则就行:
const result = filterWithDynamicOR(myArray, { age: [25], city: ["London"] }); // 结果会是Alice、Bob、Charlie这三个对象
如果之后要加name的过滤,比如找name是"Diana"或者age是30的,直接修改规则参数,完全不用碰函数本身:
const anotherResult = filterWithDynamicOR(myArray, { name: ["Diana"], age: [30] }); // 结果是Bob和Diana
进阶:支持模糊匹配(可选)
如果需要模糊搜索(比如属性值包含某个字符串),可以给函数加个模糊匹配开关:
function filterWithDynamicOR(array, filterRules, fuzzy = false) { return array.filter(item => { return Object.entries(filterRules).some(([key, values]) => { if (fuzzy) { // 模糊匹配:忽略大小写,检查属性值是否包含任意候选字符串 return values.some(value => String(item[key]).toLowerCase().includes(value.toLowerCase()) ); } // 默认精确匹配 return values.includes(item[key]); }); }); } // 用法示例:找name包含"li"或者city包含"ar"的元素 const fuzzyResult = filterWithDynamicOR(myArray, { name: ["li"], city: ["ar"] }, true); // 结果是Alice和Charlie
这样不管之后要新增什么属性的过滤规则,只要传对应的配置就行,彻底解决了固定规则需要重写逻辑的问题~
内容的提问来源于stack exchange,提问作者Marouen Mhiri
相关产品推荐
相关产品推荐

