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

如何在数组中多键搜索并动态生成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:02:50