新闻中心
J*aScript数组对象高级筛选:实现多条件模糊匹配(包含与开头匹配)

在现代web应用中,数据筛选是一个核心功能。当我们需要从一个包含多个对象的数组中,根据某个字符串属性(例如name)进行搜索时,往往不仅仅需要简单的精确匹配或判断是否包含,还需要更灵活的模糊匹配能力。例如,用户可能输入一个词希望匹配开头,输入多个词希望匹配这些词的组合,或者输入一个词希望匹配任意位置包含该词的项。
筛选需求分析
假设我们有一个对象数组,每个对象都有一个id和name属性:
const test = [
{ id: 1, name: 'Taliparamba Co Op Hospital' },
{ id: 1, name: 'Athikkal Saw Mill,Kallai' },
{ id: 1, name: 'Marhaba Ice Plant Atholi' },
];我们需要实现以下两种核心筛选逻辑:
-
开头匹配或多词开头匹配:
- 当搜索'tali'时,应匹配'Taliparamba Co Op Hospital'(Taliparamba以tali开头)。
- 当搜索'tali Co OP'时,应匹配'Taliparamba Co Op Hospital'(Taliparamba以tali开头,且包含Co Op)。
-
包含匹配:
- 当搜索'ath'时,应匹配'Athikkal Saw Mill,Kallai'(Athikkal包含ath)和'Marhaba Ice Plant Atholi'(Atholi包含ath)。
解决方案:利用正则表达式实现灵活匹配
为了高效且灵活地处理上述复杂的模糊匹配需求,正则表达式是理想的选择。通过动态构建正则表达式,我们可以实现强大的搜索功能。
Mureka
Mureka是昆仑万维最新推出的一款AI音乐创作工具,输入歌词即可生成完整专属歌曲。
1091
查看详情
核心思路
- 将用户输入的搜索字符串拆分成独立的词语。
- 为每个词语构建一个正则表达式片段,并用.*?\b(非贪婪匹配任意字符直到下一个词边界)连接起来,以允许匹配词语之间有其他字符或词语。
- 在整个正则表达式的开头添加\b,确保第一个搜索词在目标字符串中从一个词的边界开始匹配。
- 使用i标志实现大小写不敏感匹配。
实现步骤
首先,定义我们的数据数组:
const test = [
{ id: 1, name: 'Taliparamba Co Op Hospital' },
{ id: 1, name: 'Athikkal Saw Mill,Kallai' },
{ id: 1, name: 'Marhaba Ice Plant Atholi' },
];接下来,我们创建一个search函数,它接收一个数组和搜索字符串作为参数:
function search(arr, str) {
// 1. 处理空搜索字符串
if (!str || str.trim() === '') {
return arr
; // 如果搜索字符串为空,返回原始数组
}
// 2. 构建正则表达式
// 将搜索字符串按空格分割成词语,并用 '.*?\b' 连接
// '.*?' 表示非贪婪匹配任意字符(0次或多次)
// '\b' 表示词边界,确保匹配的是完整的词或词的一部分
// 整体表达式以 '\b' 开头,确保第一个词从一个词的边界开始匹配
const pattern = '\b' + str.split(' ').join('.*?\b');
// 创建正则表达式对象,'i' 标志表示忽略大小写
const regexp = new RegExp(pattern, 'i');
// 3. 使用 filter 方法和 test 方法进行筛选
// filter 遍历数组的每个元素
// regexp.test(item.name) 检查元素的 name 属性是否匹配正则表达式
return arr.filter((item) => regexp.test(item.name));
}代码详解
- if (!str || str.trim() === '') { return arr; }: 这是一个良好的实践,如果搜索字符串为空或只包含空格,则直接返回原始数组,避免不必要的计算。
- str.split(' '): 将搜索字符串按空格分割成一个词语数组。例如,'tali Co OP'会变成['tali', 'Co', 'OP']。
- *`.join('.?')**: 将分割后的词语数组用'.*?'`连接起来。
- .*?: 这是一个非贪婪匹配模式。.匹配任何字符(除了换行符),*表示匹配零次或多次,?使其变为非贪婪模式,即尽可能少地匹配字符。这允许我们的搜索词之间可以有其他字符,并且这些字符的数量可以是任意的。
- \b: 这是一个词边界锚点。它匹配一个单词字符(字母、数字、下划线)和非单词字符之间的位置,或者字符串的开头/结尾。使用它能确保我们匹配的是一个完整的词或词的一部分,而不是在词的中间任意位置。
- '\b' + ...: 在整个正则表达式模式的开头添加'\b'。这确保了我们搜索的第一个词必须从目标字符串中的一个词边界开始。例如,搜索'ath'时,它会匹配'Athikkal'中的Ath,而不是'somethingAthe'中的Athe。
- new RegExp(pattern, 'i'): 创建一个新的正则表达式对象。pattern是我们动态生成的匹配规则,'i'是标志,表示进行大小写不敏感匹配。
- arr.filter((item) => regexp.test(item.name)): 使用数组的filter方法遍历arr数组。对于每个item,调用regexp.test(item.name)方法。如果item.name匹配我们构建的正则表达式,test方法返回true,该item就会被包含在最终的过滤结果中。
示例用法
现在,我们可以使用search函数来测试我们的筛选逻辑:
// 原始数据
const test = [
{ id: 1, name: 'Taliparamba Co Op Hospital' },
{ id: 1, name: 'Athikkal Saw Mill,Kallai' },
{ id: 1, name: 'Marhaba Ice Plant Atholi' },
];
// 示例一:开头匹配
console.log("搜索 'tali':", search(test, 'tali'));
// 预期输出: [{ id: 1, name: 'Taliparamba Co Op Hospital' }]
// 示例二:多词组合匹配(开头+包含)
console.log("搜索 'tali Co OP':", search(test, 'tali Co OP'));
// 预期输出: [{ id: 1, name: 'Taliparamba Co Op Hospital' }]
// 示例三:包含匹配
console.log("搜索 'ath':", search(test, 'ath'));
// 预期输出: [
// { id: 1, name: 'Athikkal Saw Mill,Kallai' },
// { id: 1, name: 'Marhaba Ice Plant Atholi' }
// ]
// 示例四:空字符串搜索
console.log("搜索 '':", search(test, ''));
// 预期输出: 原始数组全部返回
// 示例五:不匹配
console.log("搜索 'xyz':", search(test, 'xyz'));
// 预期输出: []注意事项与总结
-
性能考量: 对于非常大的数据集(例如数万甚至数十万条记录),每次搜索都动态构建正则表达式并遍历数组可能会有性能开销。在这种情况下,可以考虑:
- 对数据进行预处理或索引(例如使用Fuse.js等模糊搜索库)。
- 在后端进行搜索,减轻前端负担。
- 对搜索结果进行缓存。
- 特殊字符处理: 如果用户输入的搜索字符串可能包含正则表达式中的特殊字符(如., *, +, ?, (, ), [, ], {, }, |, ^, $, \),则需要在构建pattern之前对str进行转义,以防止意外的匹配行为或正则表达式错误。例如,可以使用str.replace(/[.*+?^${}()|[]\]/g, '\$&')进行转义。
- 精确度与灵活性: 当前的解决方案提供了高度的灵活性,允许词语之间有间隔。如果需要更严格的匹配(例如,要求所有词语必须按顺序出现且不能有其他词语间隔),则需要调整正则表达式的构建逻辑。
- 用户体验: 结合防抖(debounce)或节流(throttle)技术,可以优化用户在输入搜索词时的体验,避免频繁触发搜索操作。
通过上述方法,我们能够灵活地处理J*aScript中对象数组的复杂模糊搜索需求,实现既能匹配开头又能匹配包含,甚至支持多词组合的高级筛选功能。这种基于正则表达式的方案强大且可扩展,是处理类似场景的有效工具。
以上就是J*aScript数组对象高级筛选:实现多条件模糊匹配(包含与开头匹配)的详细内容,更多请关注其它相关文章!
# 如何使用
# 潜江seo搜索推广费用
# 营销推广策略的英文翻译
# 上海seo规则使用方法
# 苍南网站建设推广
# 东阳seo全网营销
# 黑帽seo易下拉程序
# 网站优化 枫子
# 无锡网络营销策划推广公司
# 厦门网站建设企业详情
# 王建设医生网站
# 多个
# 多条
# javascript
# 的是
# 这是一个
# 遍历
# 第一个
# 可以使用
# ai
# 后端
# 工具
# 正则表达式
# 前端
# js
# java
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
如何将HTML表格多行数据保存到Google Sheet
Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问
优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践
拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法
Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法
大麦的“候补”是什么意思 大麦候补购票规则【详解】
内存疯狂猛猛涨价:主板销量直接腰斩!
解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常
在命令行怎么运行html项目_命令行运行html项目方法【教程】
AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看
cad如何更改注释性对象的比例_cad注释性比例调整方法
照顾宝贝2小游戏点击立即在线玩
qq游戏跨平台入口_qq游戏多设备同步登录
怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】
J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程
解决J*aScript中重复选择项的确认对话框显示问题
Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】
Centos/Linux 系统下安装 composer 的完整步骤
为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法
利用Bokeh CustomJS动态控制DataTable列可见性
12306怎么选座位选到安静区_12306选座安静区域选择策略
“在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法
MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具
C#中解析不规范的HTML为XML 常见的坑与解决办法
AO3官方镜像站点汇总 AO3同人作品网页版直达链接
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读
怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】
TikTok评论显示延迟如何处理 TikTok评论刷新优化方法
快手赚钱渠道_快手收益来源
Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式
AO3最新官网入口公告_2025AO3镜像站实时查询方法
如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题
高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】
AO3官方在线访问地址 Archive of Our Own最新镜像合集
抓大鹅解压小游戏 抓大鹅摸鱼解压入口
vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法
J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题
深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射
b站如何看历史记录_b站观看历史找回方法
C++如何解决segmentation fault_C++段错误调试与原因分析
vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧
响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配
抖音网页版怎么|直播|_抖音网页版开播操作指南
Django模型中自动计算可用余额的实现方法
漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道
win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】
HTML空白字符处理机制:渲染、DOM与编码实践
如何提高微信支付的安全性_微信支付安全防护与设置建议
Lar*el Form Request中唯一性验证在更新操作中的正确实现
消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技


2025-10-07
浏览次数:次
返回列表
; // 如果搜索字符串为空,返回原始数组
}
// 2. 构建正则表达式
// 将搜索字符串按空格分割成词语,并用 '.*?\b' 连接
// '.*?' 表示非贪婪匹配任意字符(0次或多次)
// '\b' 表示词边界,确保匹配的是完整的词或词的一部分
// 整体表达式以 '\b' 开头,确保第一个词从一个词的边界开始匹配
const pattern = '\b' + str.split(' ').join('.*?\b');
// 创建正则表达式对象,'i' 标志表示忽略大小写
const regexp = new RegExp(pattern, 'i');
// 3. 使用 filter 方法和 test 方法进行筛选
// filter 遍历数组的每个元素
// regexp.test(item.name) 检查元素的 name 属性是否匹配正则表达式
return arr.filter((item) => regexp.test(item.name));
}