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

JavaScript中如何修改多条件过滤函数以支持子串匹配?

问题分析

你的nestedFilter函数目前是精确匹配过滤数组中的值,而你需要的是子串匹配,同时要满足两个逻辑规则:

  • 不同字段之间是AND逻辑(所有启用过滤的字段都要满足条件)
  • 同一字段的多个过滤值是OR逻辑(只要匹配其中一个子串即可)

修改后的函数

我调整了核心匹配逻辑,把精确匹配改成子串检查,同时适配了所需的逻辑规则:

nestedFilter(data, filters) { 
  let filterKeys = Object.keys(filters); 
  return data.filter(function (eachObj) { 
    return filterKeys.every(function (eachKey) { 
      const filterValues = filters[eachKey];
      // 如果当前字段没有设置过滤值,直接通过检查
      if (!filterValues.length) { 
        return true; 
      }
      // 检查当前对象的字段值是否包含任意一个过滤子串(实现同字段多值OR逻辑)
      // 可选:如果需要忽略大小写匹配,可转成toLowerCase()统一处理
      return filterValues.some(filterVal => 
        eachObj[eachKey]?.includes(filterVal)
      );
    }); 
  }); 
}

关键改动说明

  1. 替换匹配逻辑:
    • 把原有的filters[eachKey].includes(eachObj[eachKey])(精确检查对象值是否在过滤数组中),改成filterValues.some(...) + includes组合
    • some方法实现了同一字段多值的OR逻辑,只要有一个子串匹配就通过当前字段的检查
    • eachObj[eachKey]?.includes(filterVal)实现子串匹配,可选链?.避免对象字段不存在时抛出错误
  2. 大小写兼容扩展(可选):
    如果需要忽略大小写进行匹配,可以修改核心匹配代码为:
    return filterValues.some(filterVal => 
      eachObj[eachKey]?.toLowerCase().includes(filterVal.toLowerCase())
    );
    

测试验证

用你提供的测试数据和过滤器运行修改后的函数:

const data = [ 
  { "NAME": "Johnathon", "AGE": "19 ", "GENDER": "M", "SPORT": "Hockey", "SCHOLARSHIP": "N" }, 
  { "NAME": "Jessica", "AGE": "20", "GENDER": "F", "SPORT": "Football", "SCHOLARSHIP": "Y" }, 
  { "NAME": "Matty", "AGE": "20", "GENDER": "NB", "SPORT": "Tennis", "SCHOLARSHIP": "Y" }, 
  { "NAME": "Amy", "AGE": "20", "GENDER": "F", "SPORT": "Football", "SCHOLARSHIP": "N" } 
];
const filters = { "NAME": [], "AGE": [], "GENDER": [], "SPORT": ["Foot", "Hockey"], "SCHOLARSHIP": [] };

console.log(nestedFilter(data, filters));

会返回你预期的三个对象:Johnathon(SPORT匹配Hockey)、Jessica和Amy(SPORT匹配Foot子串)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 13:42:42