当前位置:首页 > JavaScript

js实现模糊搜索

2026-01-30 13:45:38JavaScript

实现模糊搜索的基本思路

模糊搜索的核心是通过输入的关键词匹配目标数据,允许存在一定的不完全匹配。常见的实现方式包括字符串包含检查、正则表达式匹配或使用第三方库。

使用字符串的 includes 方法

最简单的方法是使用 JavaScript 字符串的 includes 方法检查目标字符串是否包含搜索词。这种方法区分大小写,适合简单场景。

const data = ['apple', 'banana', 'orange', 'grape'];
const searchTerm = 'ap';

const results = data.filter(item => item.includes(searchTerm));
console.log(results); // ['apple']

不区分大小写的模糊搜索

通过将字符串和搜索词统一转换为小写(或大写)实现不区分大小写的匹配。

const data = ['Apple', 'banana', 'Orange', 'grape'];
const searchTerm = 'ap';

const results = data.filter(item => 
  item.toLowerCase().includes(searchTerm.toLowerCase())
);
console.log(results); // ['Apple']

使用正则表达式实现更灵活的匹配

正则表达式可以实现更复杂的模糊匹配逻辑,例如部分匹配、开头匹配或结尾匹配。

js实现模糊搜索

const data = ['apple', 'banana', 'orange', 'grape'];
const searchTerm = 'na';

const regex = new RegExp(searchTerm, 'i'); // 'i'表示不区分大小写
const results = data.filter(item => regex.test(item));
console.log(results); // ['banana', 'orange']

实现基于相似度的模糊搜索(Levenshtein 距离)

对于更高级的模糊搜索,可以计算字符串之间的编辑距离(Levenshtein 距离),匹配相似度较高的结果。

function levenshteinDistance(a, b) {
  const matrix = [];
  for (let i = 0; i <= b.length; i++) {
    matrix[i] = [i];
  }
  for (let j = 0; j <= a.length; j++) {
    matrix[0][j] = j;
  }
  for (let i = 1; i <= b.length; i++) {
    for (let j = 1; j <= a.length; j++) {
      if (b.charAt(i - 1) === a.charAt(j - 1)) {
        matrix[i][j] = matrix[i - 1][j - 1];
      } else {
        matrix[i][j] = Math.min(
          matrix[i - 1][j - 1] + 1,
          matrix[i][j - 1] + 1,
          matrix[i - 1][j] + 1
        );
      }
    }
  }
  return matrix[b.length][a.length];
}

const data = ['apple', 'banana', 'orange', 'grape'];
const searchTerm = 'aple';
const threshold = 2; // 允许的最大编辑距离

const results = data.filter(item => 
  levenshteinDistance(item, searchTerm) <= threshold
);
console.log(results); // ['apple']

使用第三方库简化实现

如果项目允许使用第三方库,可以考虑使用 Fuse.jslodash 的模糊搜索功能。

安装 Fuse.js:

js实现模糊搜索

npm install fuse.js

使用示例:

import Fuse from 'fuse.js';

const data = ['apple', 'banana', 'orange', 'grape'];
const options = {
  includeScore: true,
  threshold: 0.3, // 匹配阈值,值越小匹配越严格
};

const fuse = new Fuse(data, options);
const results = fuse.search('ap');
console.log(results.map(item => item.item)); // ['apple']

在前端实现实时模糊搜索

结合输入框的事件监听,可以实现实时模糊搜索功能。

<input type="text" id="searchInput" placeholder="Search...">
<ul id="results"></ul>

<script>
  const data = ['apple', 'banana', 'orange', 'grape'];
  const searchInput = document.getElementById('searchInput');
  const resultsContainer = document.getElementById('results');

  searchInput.addEventListener('input', (e) => {
    const searchTerm = e.target.value.toLowerCase();
    const filteredData = data.filter(item => 
      item.toLowerCase().includes(searchTerm)
    );

    resultsContainer.innerHTML = '';
    filteredData.forEach(item => {
      const li = document.createElement('li');
      li.textContent = item;
      resultsContainer.appendChild(li);
    });
  });
</script>

性能优化建议

对于大型数据集,模糊搜索可能成为性能瓶颈。可以通过以下方式优化:

  • 对数据进行预处理(如转换为小写)。
  • 使用防抖(debounce)技术减少实时搜索的频率。
  • 考虑使用 Web Worker 在后台线程中执行计算密集型操作。

标签: 模糊js
分享给朋友:

相关文章

vue实现模糊

vue实现模糊

Vue实现模糊搜索的方法 在Vue中实现模糊搜索功能,可以通过多种方式完成。以下是几种常见的方法: 使用JavaScript的filter和includes方法 <template>…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…

js图片轮播的实现

js图片轮播的实现

基础图片轮播实现 使用HTML、CSS和JavaScript实现一个简单的图片轮播效果。HTML部分定义轮播容器和图片,CSS负责样式和过渡效果,JavaScript处理逻辑。 <div cl…