当前位置:首页 > 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
分享给朋友:

相关文章

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…

js实现菜单

js实现菜单

实现基本HTML结构 使用HTML创建菜单的基本框架,通常包含<ul>和<li>元素。示例结构如下: <ul id="menu"> <li><…