新闻中心
J*aScript数组对象高级过滤:实现多条件(开头匹配与内容包含)搜索

需求背景:多条件对象数组过滤
在前端开发中,我们经常需要对包含大量数据的对象数组进行筛选和搜索。常见的场景包括:
- 开头匹配(StartWith):用户输入部分关键词,系统返回以这些关键词开头的匹配项。例如,搜索“tali”能找到“Taliparamba Co Op Hospital”。
- 多词顺序匹配:用户输入多个关键词,系统返回包含所有关键词且按顺序出现的匹配项。例如,搜索“tali Co OP”也能找到“Taliparamba Co Op Hospital”。
- 内容包含(Contains):用户输入关键词,系统返回名称中包含该关键词的所有匹配项,无论关键词出现在哪个位置。例如,搜索“ath”能找到“Athikkal Saw Mill,Kallai”和“Marhaba Ice Plant Atholi”。
这些需求往往需要一个既灵活又高效的解决方案。
核心策略:基于正则表达式的灵活匹配
为了同时满足上述多种过滤条件,我们选择使用J*aScript的正则表达式(RegExp)作为核心工具。正则表达式的强大之处在于其能够定义复杂的匹配模式,并提供高效的字符串搜索能力。
我们的策略是:
- 将用户输入的搜索字符串分解成独立的单词。
- 利用正则表达式的元字符,构建一个能够匹配这些单词按顺序出现,且单词之间可以有任意字符(或无字符)间隔的模式。
- 确保匹配过程忽略大小写,以提升用户体验。
实现步骤与代码示例
以下是实现多条件对象数组过滤的J*aScript函数及其应用示例:
Blackink AI纹身生成
创建类似纹身的设计,生成独特纹身
80
查看详情
立即学习“J*a免费学习笔记(深入)”;
const testData = [
{ id: 1, name: 'Taliparamba Co Op Hospital' },
{ id: 1, name: 'Athikkal Saw Mill,Kallai' },
{ id: 1, name: 'Marhaba Ice Plant Atholi' },
];
/**
* 根据搜索词过滤对象数组
* @param {Array<Object>} arr - 待过滤的对象数组
* @param {string} searchTerm - 用户输入的搜索词
* @returns {Array<Object>} 过滤后的数组
*/
function filterArrayOfObjects(arr, searchTerm) {
if (!searchTerm) {
return arr; // 如果搜索词为空,返回原数组
}
// 1. 将搜索词按空格分割成单词,并对每个单词进行正则转义
// 转义是为了防止搜索词中包含特殊正则字符(如 . * + ? 等)导致匹配错误
const escapedSearchTerms = searchTerm
.split(' ')
.map(word => word.replace(/[.*+?^${}()|[]\]/g, '\$&'));
// 2. 构建正则表达式模式
// 使用 '.*?' 非贪婪匹配任意字符(0次或多次)连接各个单词,
// 并用 '\b' 单词边界确保匹配的是独立的单词或单词的一部分,而不是单词内部的字符。
const pattern = escapedSearchTerms.join('.*?\b');
// 3. 创建正则表达式对象
// '\b' 在模式开头,确保整个搜索从一个单词边界开始匹配。
// 'i' 标志表示忽略大小写。
const regex = new RegExp('\b' + pattern, 'i');
// 4. 使用 Array.prototype.filter() 方法进行过滤
return arr.filter(item => regex.test(item.name));
}
// 示例用法:
console.log("--- 搜索 'tali' (开头匹配) ---");
console.log(filterArrayOfObjects(testData, 'tali'));
/*
预期输出:
[ { id: 1, name: 'Taliparamba Co Op Hospital' } ]
*/
console.log("
--- 搜索 'tali Co OP' (多词顺序匹配) ---");
console.log(filterArrayOfObjects(testData, 'tali Co OP'));
/*
预期输出:
[ { id: 1, name: 'Taliparamba Co Op Hospital' } ]
*/
console.log("
--- 搜索 'ath' (内容包含) ---");
console.log(filterArrayOfObjects(testData, 'ath'));
/*
预期输出:
[
{ id: 1, name: 'Athikkal Saw Mill,Kallai' },
{ id: 1, name: 'Marhaba Ice Plant Atholi' }
]
*/
console.log("
--- 搜索 'mill' (内容包含) ---");
console.log(filterArrayOfObjects(testData, 'mill'));
/*
预期输出:
[ { id: 1, name: 'Athikkal Saw Mill,Kallai' } ]
*/
console.log("
--- 搜索 'hospital' (内容包含,大小写不敏感) ---");
console.log(filterArrayOfObjects(testData, 'hospital'));
/*
预期输出:
[ { id: 1, name: 'Taliparamba Co Op Hospital' } ]
*/
console.log("
--- 搜索 '' (空搜索词) ---");
console.log(filterArrayOfObjects(testData, ''));
/*
预期输出:
[
{ id: 1, name: 'Taliparamba Co Op Hospital' },
{ id: 1, name: 'Athikkal Saw Mill,Kallai' },
{ id: 1, name: 'Marhaba Ice Plant Atholi' }
]
*/关键点解析:正则表达式构建
理解正则表达式的构建是掌握此解决方案的关键:
- searchTerm.split(' '): 首先,将用户输入的搜索词按空格分割成一个单词数组。例如,'tali Co OP' 会变成 ['tali', 'Co', 'OP']。
- *`.map(word => word.replace(/[.+?^${}()|[]]/g, '$&'))**: 这一步非常重要,它对每个分割出的单词进行了正则表达式特殊字符的转义。例如,如果搜索词是"A.B",没有转义的话.会被解释为匹配任意字符,而不是字面上的点。$&` 表示将匹配到的特殊字符前面加上一个反斜杠进行转义。
- *`.join('.?')`**: 这是构建模式的核心。
- .*?: 这是一个非贪婪匹配模式。. 匹配除换行符以外的任何单个字符,* 匹配前一个字符零次或多次,? 使 * 变为非贪婪模式,即尽可能少地匹配字符。这意味着在两个搜索单词之间,可以有零个或多个任意字符。
- \b: 这是一个单词边界锚点。它匹配一个单词字符(字母、数字、下划线)和一个非单词字符(或字符串的开头/结尾)之间的位置。使用它确保了我们匹配的是完整的单词或单词的一部分,而不是在另一个单词内部的字符序列。
- 例如,['tali', 'Co', 'OP'] 会被连接成 tali.*?\bCo.*?\bOP。
-
new RegExp('\b' + pattern, 'i'):
- 在整个模式的开头添加 \b:这确保了整个搜索模式(即第一个搜索单词)必须从目标字符串中的一个单词边界开始匹配。这对于实现“开头匹配”和“多词顺序匹配”至关重
要,因为它防止了在单词内部的任意位置开始匹配。 - 'i' 标志:表示执行不区分大小写的匹配。这极大地提升了用户体验,用户无需关心输入的大小写。
- 在整个模式的开头添加 \b:这确保了整个搜索模式(即第一个搜索单词)必须从目标字符串中的一个单词边界开始匹配。这对于实现“开头匹配”和“多词顺序匹配”至关重
使用考量与进阶优化
-
性能考量:
- 对于小型数据集,这种方法非常高效。但如果处理数万甚至数十万条数据,且搜索操作频繁,正则表达式的构建和测试可能会带来一定的性能开销。
- 可以考虑对搜索结果进行缓存,或者在用户输入时使用防抖(debounce)或节流(throttle)技术,避免短时间内频繁触发过滤操作。
-
精确度与灵活性:
- 当前的 \b 确保了匹配从单词边界开始,这在很多场景下是理想的。如果需要更严格的“字符串开头匹配”而非“单词边界开头匹配”,可以将 new RegExp('\b' + pattern, 'i') 修改为 new RegExp('^' + pattern, 'i'),但这样会限制 tali Co OP 这种多词匹配,除非 Taliparamba Co Op Hospital 本身就是以 tali Co OP 开头。
- 如果希望匹配结果包含所有符合条件的字段(不仅仅是name),可以将 item.name 替换为遍历 item 所有字符串类型字段的逻辑。
-
用户体验:
- 提供清晰的搜索输入框,并可以考虑在搜索结果为空时给出提示。
- 对于复杂的搜索词,可以提供搜索语法提示。
总结
通过巧妙地运用J*aScript的正则表达式,我们成功实现了一个功能强大且灵活的对象数组过滤函数,能够优雅地处理“开头匹配”、“多词顺序匹配”以及“内容包含”等多种搜索场景。理解正则表达式的构建逻辑是掌握此方案的关键。在实际应用中,结合性能优化和用户体验的考量,可以构建出高效且用户友好的数据筛选功能。
以上就是J*aScript数组对象高级过滤:实现多条件(开头匹配与内容包含)搜索的详细内容,更多请关注其它相关文章!
# word
# java
# 前端
# 正则表达式
# javascript
# 东莞网站建设网页推广
# 热门推广音乐视频素材网站
# 抚顺正规的seo优化站
# 象山seo的优化需求
# 姑苏网站优化有哪些
# 湖南seo营销电话
# 太仓外贸营销推广公司电话
# 做电商网站如何引流推广
# 西城网站建设网络推广
# 推特关键词排名能刷吗
# 为空
# 如何用
# 搜索结果
# 能找到
# 这是一个
# 多个
# 的是
# 多条
# 关键词
# ai
# 前端开发
# 工具
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略
俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航
J*a实现学校排课程序_面向对象结构化项目示例
C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能
为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法
在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明
fishbowl官网免费版 fishbowl养鱼网站入口
生成rdflib自定义SPARQL函数:参数匹配与实践指南
抖音极速版最新版本 抖音极速版官方下载地址
天眼查企业查询官网入口 天眼查官方网页版查询
怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】
支付宝如何设置安全保护_支付宝安全设置的全面教程
C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入
CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠
word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法
漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道
Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接
c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发
mysql备份恢复性能优化_mysql备份恢复性能优化方法
解决 Express.js 中 PUT 请求密码修改失败的路由配置指南
俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口
Spyder启动失败:字体文件权限拒绝错误解决方案
从J*aScript对象中精确提取指定属性的教程
Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法
excel怎么制作工资条 excel快速生成工资条的方法
Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】
Flexbox布局实践:实现粘性导航栏与底部固定页脚
QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口
C++如何操作注册表_Windows平台下C++读写注册表的API函数详解
ExcelARRAYTOTEXT函数怎么自定义分隔符输出数组文本_ARRAYTOTEXT实现动态生成SQL语句
谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航
Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南
电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】
深入理解Google Cloud Datastore查询:祖先路径与数据一致性
J*a中实现Go语言select通道多路复用机制
Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】
Node.js中HTML按钮与J*aScript函数交互的正确姿势
AO3网页版最新入口合集 Archive of Our Own在线访问指南
修复二维数组索引越界异常:一维循环到二维坐标的正确映射
Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践
千牛数据看板网页版_千牛数据看板网页版访问方法
taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】
J*aScript Promise链中如何正确终止后续.then执行并处理错误
Python:递归比较文件夹内容并找出特定类型文件的差异
jQuery Mask 插件中实现电话号码固定前导零的教程
魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】
利用Bokeh CustomJS动态控制DataTable列可见性
Python类型检查:优化关联可选属性的Mypy推断策略
MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令
文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】


2025-10-07
浏览次数:次
返回列表
要,因为它防止了在单词内部的任意位置开始匹配。