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

如何使用indexOf过滤多个关键词?实现标题无序搜索匹配

解决方案

要实现无论关键词顺序如何都能匹配(比如搜“Pizza Town”或“Town Pizza”都能找到目标视频),需要调整原代码的匹配逻辑——原代码存在indexOf传入数组的错误,且未处理关键词顺序颠倒的场景,以下是修正后的实现:

问题分析

原代码的核心问题:

  • p2.toLowerCase().split(',')返回的是数组,但indexOf仅接受字符串作为参数,导致匹配逻辑完全失效
  • 未考虑关键词顺序颠倒的场景,无法满足“Pizza Town”和“Town Pizza”互相匹配的需求

修正后的代码

return function matchAnyOrder(p1, p2) {
  // 将标题拆分为小写词的集合,提升匹配效率
  const titleWords = new Set(p1.toLowerCase().split(' '));
  // 将搜索词拆分为小写的词数组
  const searchWords = p2.toLowerCase().split(' ');
  
  // 检查所有搜索词是否都存在于标题词集合中(不关心顺序)
  return searchWords.every(word => titleWords.has(word));
};

代码说明

  • 用Set存储标题拆分后的词,是为了快速判断搜索词是否存在,提升匹配效率
  • 统一转小写实现不区分大小写的匹配
  • 使用every方法确保搜索的每一个词都在标题中出现,完全忽略顺序
  • 如果你的标题是逗号分隔的标签(原代码用了split(',')),只需把split(' ')改成split(','),再加上trim()去除标签前后空格即可适配

适配逗号分隔标签的场景

若p1是类似"Pizza,Town"的逗号分隔标签列表,代码调整为:

return function matchAnyOrder(p1, p2) {
  const titleTags = new Set(p1.toLowerCase().split(',').map(tag => tag.trim()));
  const searchTags = p2.toLowerCase().split(' ').map(tag => tag.trim());
  
  return searchTags.every(tag => titleTags.has(tag));
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:02:38