J*aScript中基于子字符串值筛选对象数组的ES6优化实践


JavaScript中基于子字符串值筛选对象数组的ES6优化实践

本文深入探讨了在j*ascript中根据给定字符串的子串值来高效筛选对象数组的方法。我们将从传统的`indexof`方法入手,逐步介绍es6中更现代化、更具可读性的`string.prototype.match`和`string.prototype.includes`等优化方案,并通过代码示例和最佳实践,帮助开发者选择最适合其场景的字符串匹配和数组过滤策略。

1. 理解核心问题:基于子字符串筛选对象

在前端开发中,我们经常遇到需要从一个对象集合中,根据某个对象的特定属性值是否包含在另一个字符串中来筛选数据的情况。例如,我们有一个包含多位企业高管信息的数组,以及一个包含特定高管姓名的字符串,目标是找出这些指定高管的详细信息。

假设我们有以下数据结构:

const usecases =  [
    { usecaseId: 'Bill Gates', id: 1, description: 'CEO & founder, Microsoft' },
    { usecaseId: 'Mark Zuckerberg', id: 2, description: 'CEO, Facebook' },
    { usecaseId: 'Steve Jobs', id: 3, description: 'CEO & co-founder, Apple' },
    { usecaseId: 'Satya Nadella', id: 4, description: 'CEO, Microsoft' },
    { usecaseId: 'Elon Musk', id: 5, description: 'CEO, Tesla & SpaceX' },
    { usecaseId: 'Ginni Rometty', id: 6, description: 'CEO, IBM' },
    { usecaseId: 'Jeff Bezos', id: 7, description: 'CEO, Amazon' },
    { usecaseId: 'Larry Page', id: 8, description: 'CEO, Google' },
    { usecaseId: 'Jack Dorsey', id: 9, description: 'CEO, Twitter' },
    { usecaseId: 'Meg Whitman', id: 10, description: 'CEO, HP' },
    { usecaseId: 'Tim Cook', id: 11, description: 'CEO, Apple' },
    { usecaseId: 'Jeff Weiner', id: 12, description: 'CEO, LinkedIn' },
];

const str = "Bill Gates, Mark Zuckerberg, Tim Cook, Jeff Bezos, Steve Jobs";

我们的任务是,从 usecases 数组中筛选出 usecaseId 属性值存在于 str 字符串中的所有对象。

2. 传统方法:使用 String.prototype.indexOf()

在ES6之前,或者对于简单的子字符串查找,String.prototype.indexOf() 是一个常用的方法。它返回子字符串在原字符串中首次出现的索引,如果未找到则返回 -1。

以下是使用 indexOf() 实现筛选的示例代码:

const newArrIndexOf = usecases.filter(usecaseObj => {
    // indexOf 返回 -1 表示未找到,否则返回索引
    return str.indexOf(usecaseObj.usecaseId) !== -1;
});

console.log("使用 indexOf 筛选结果:", newArrIndexOf);
/*
输出:
[
  { usecaseId: 'Bill Gates', id: 1, description: 'CEO & founder, Microsoft' },
  { usecaseId: 'Mark Zuckerberg', id: 2, description: 'CEO, Facebook' },
  { usecaseId: 'Steve Jobs', id: 3, description: 'CEO & co-founder, Apple' },
  { usecaseId: 'Jeff Bezos', id: 7, description: 'CEO, Amazon' },
  { usecaseId: 'Tim Cook', id: 11, description: 'CEO, Apple' }
]
*/

这种方法功能上是正确的,但从代码可读性上来说,!== -1 的判断略显冗余。

3. ES6优化方案一:使用 String.prototype.match()

String.prototype.match() 方法用于将字符串与正则表达式进行匹配。如果匹配成功,它会返回一个包含匹配结果的数组;如果未找到任何匹配,则返回 null。利用这一特性,我们可以对其返回值进行布尔转换来判断是否存在匹配。

乾坤圈新媒体矩阵管家 乾坤圈新媒体矩阵管家

新媒体账号、门店矩阵智能管理系统

乾坤圈新媒体矩阵管家 219 查看详情 乾坤圈新媒体矩阵管家
const newArrMatch = usecases.filter(usecaseObj => {
    // match 返回 null 或匹配数组。
    // !! 将 null 转换为 false,将数组转换为 true。
    return !!str.match(usecaseObj.usecaseId);
});

console.log("使用 match 筛选结果:", newArrMatch);
/*
输出与 indexOf 相同:
[
  { usecaseId: 'Bill Gates', id: 1, description: 'CEO & founder, Microsoft' },
  { usecaseId: 'Mark Zuckerberg', id: 2, description: 'CEO, Facebook' },
  { usecaseId: 'Steve Jobs', id: 3, description: 'CEO & co-founder, Apple' },
  { usecaseId: 'Jeff Bezos', id: 7, description: 'CEO, Amazon' },
  { usecaseId: 'Tim Cook', id: 11, description: 'CEO, Apple' }
]
*/

这里使用了双重否定操作符 !! 将 match 方法的返回值(null 或数组)强制转换为布尔值,使其可以直接用于 filter 方法的条件判断。这种写法简洁明了,并且当需要更复杂的模式匹配时,可以方便地扩展为正则表达式。

4. ES6优化方案二:使用 String.prototype.includes()

String.prototype.includes() 是ES6引入的一个更现代、更直观的字符串方法,用于判断一个字符串是否包含在另一个字符串中。它直接返回一个布尔值(true 或 false),省去了 indexOf() !== -1 的判断。

const newArrIncludes = usecases.filter(usecaseObj => {
    // includes 直接返回 true 或 false
    return str.includes(usecaseObj.usecaseId);
});

console.log("使用 includes 筛选结果:", newArrIncludes);
/*
输出与 indexOf 和 match 相同:
[
  { usecaseId: 'Bill Gates', id: 1, description: 'CEO & founder, Microsoft' },
  { usecaseId: 'Mark Zuckerberg', id: 2, description: 'CEO, Facebook' },
  { usecaseId: 'Steve Jobs', id: 3, description: 'CEO & co-founder, Apple' },
  { usecaseId: 'Jeff Bezos', id: 7, description: 'CEO, Amazon' },
  { usecaseId: 'Tim Cook', id: 11, description: 'CEO, Apple' }
]
*/

对于简单的子字符串存在性检查,includes() 方法是ES6中最推荐的选择,因为它语义清晰,代码可读性极高。

5. 进阶考量与最佳实践

在实际开发中,除了上述基本用法,还有一些进阶考量:

  • 性能: 对于大多数场景,includes() 通常在性能上与 indexOf() 相近,甚至在某些引擎中可能略优。match() 由于涉及正则表达式引擎,对于非常简单的子字符串匹配可能会有轻微的性能开销,但在处理复杂模式时其优势明显。在绝大多数应用中,这种性能差异微乎其微,不应成为选择方法的主要依据。
  • 大小写敏感性: indexOf()、includes() 和 match() 默认都是大小写敏感的。如果需要进行大小写不敏感的匹配,可以先将字符串转换为统一大小写(例如都转为小写),再进行比较。
    // 示例:大小写不敏感匹配
    const searchStrLower = str.toLowerCase();
    const newArrCaseInsensitive = usecases.filter(usecaseObj => {
        return searchStrLower.includes(usecaseObj.usecaseId.toLowerCase());
    });
    console.log("大小写不敏感筛选结果:", newArrCaseInsensitive);
  • 正则表达式的强大: match() 方法的真正威力在于它能接受正则表达式作为参数。如果搜索模式不仅仅是简单的子字符串,而是需要匹配特定格式、边界或多个可选模式,那么 match() 配合正则表达式将是首选。
    // 示例:使用正则表达式匹配 "Gates" 或 "Jobs"
    const regex = /Gates|Jobs/;
    const newArrRegex = usecases.filter(usecaseObj => {
        // RegExp.prototype.test() 更适合布尔判断
        return regex.test(usecaseObj.usecaseId); 
    });
    console.log("使用正则表达式筛选结果 (Gates或Jobs):", newArrRegex);

    这里使用了 RegExp.prototype.test() 方法,它专门用于测试字符串是否匹配某个正则表达式,并直接返回 true 或 false,比 match() 后再进行布尔转换更直接。

6. 总结

本文对比了J*aScript中基于子字符串值筛选对象数组的不同方法。从传统的 indexOf() 到ES6引入的 match() 和 includes(),每种方法都有其适用场景:

  • String.prototype.indexOf(): 传统且广泛支持,通过判断 !== -1 来确定子串是否存在。
  • String.prototype.includes(): ES6推荐的简单子字符串存在性检查方法,语义清晰,直接返回布尔值,代码最简洁。
  • String.prototype.match() (配合 !!): 适用于需要进行布尔判断的场景,尤其当匹配逻辑可能需要扩展到正则表达式时,具有良好的可扩展性。
  • RegExp.prototype.test() (配合正则表达式): 当需要进行复杂

以上就是J*aScript中基于子字符串值筛选对象数组的ES6优化实践的详细内容,更多请关注其它相关文章!


# 高管  # 网页seo技术大全  # 西湖区百度网站优化平台  # 协策网站建设  # 本地推广营销例案  # 塘沽免费网站建设  # 如何seo 营销  # 广东网站建设系统  # 清丰网站推广哪有  # seo推广的策略是什么  # 龙溪网站优化多少钱  # 如何用  # 布尔值  # 未找到  # 字符串值  # javascript  # 进阶  # 转换为  # 布尔  # 数据结构  # apple  # 前端开发  # facebook  # app  # seo  # 正则表达式  # go  # 前端  # java  # es6 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 抖音团长模式怎么做?团长模式是什么意思?  雨课堂官网在线登录 网页版雨课堂登录链接  大熊猫抓取竹子的“大拇指”其实是什么?蚂蚁庄园课堂今天答案最新11月30日  《饿了么》拼好饭点外卖教程2025  TikTok网页版入口快速访问 TikTok官网账号登录方法  win11怎么启用或禁用休眠 Win11 powercfg命令管理休眠文件【技巧】  如何在CSS中使用伪类:valid实现表单验证提示_结合:valid改变边框颜色  电脑“无法访问指定设备、路径或文件”怎么办?五种权限设置方法  pubmed数据库官方主页_pubmed学术论文查找官网直达  B站怎么快速升级 B站用户等级提升攻略【详解】  个人所得税办理入口 个人所得税综合所得年度汇算入口  海棠书屋官方在线书籍入口 海棠书屋文学作品浏览官网链接  MySQL多重关联查询:利用别名高效获取同一表的多个关联字段  批改网网页版登录 批改网电脑版学生登录入口  Eclipse开发J*a快速入门  mysql数据库索引类型有哪些_mysql索引类型解析  Git命令与VS Code UI操作的对应关系解析  虫虫漫画排行榜单入口_虫虫漫画编辑推荐入口  Excel怎么用XLOOKUP函数实现双向查找_ExcelXLOOKUP替代VLOOKUP+HLOOKUP的高级用法  mysql怎么导入sql文件_mysql导入sql文件的方法与技巧  @Team是什么?揭秘团队含义  C++ virtual析构函数作用_C++基类虚析构函数防止内存泄漏  PHP多语言网站的实现:会话管理与翻译函数优化教程  《tt语音》超级玩家开通方法  在PHP环境中正确加载HTML资源:CSS样式与图片路径指南  智慧团建活动报名入口 智慧团建活动报名入口手机端官网​  德邦快递查询入口登录官网 德邦快递单号查询系统入口  附近酒吧怎么找?  iPhone 13 mini如何清理Safari缓存_iPhone 13 mini浏览器缓存清理方法  苹果手机聊天记录删除了如何恢复  抖音火山版注销账号抖音会注销吗 抖音火山版与抖音账号注销关系  如何发挥新媒体矩阵作用?新媒体矩阵怎么搭建?  悟空浏览器网页版在线工具 悟空浏览器网页版在线平台入口  QQ邮箱注册地址 免费获取QQ邮箱账号  《海贝音乐》均衡器设置方法  PHP utf8_encode 字符编码转换陷阱与解决方案  天天漫画2025最新入口 天天漫画永久有效登录入口  知音漫客官网首页入口_知音漫客热门漫画推荐  C#解析来自网络的XML流数据 实时错误处理与重试机制  《海豚家》注销账号方法  Golang如何使用crypto/md5生成哈希_Golang MD5哈希生成方法  优酷官网登录入口电脑版 优酷官网网址入口  什么是Satis,如何用它搭建一个私有的composer仓库?  c++如何掌握指针的核心用法_c++指针入门到精通指南  AO3中文入口稳定分享_AO3官网HTTPS看文详解  汽水音乐网页端访问 汽水音乐官方网页直达  拷贝漫画2025网页版入口 拷贝漫画官网免费看全集  J*a中的值传递到底指什么_值传递模型在参数传递中的真正含义说明  《单词速记宝》设置学习计划方法  抖音猜你想搜能说明对方搜过吗 

 2025-11-26

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.