当前位置:首页 > 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']

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

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

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:

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实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Jav…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…