当前位置:首页 > JavaScript

js实现搜索功能

2026-02-28 18:00:33JavaScript

实现搜索功能的基本方法

在JavaScript中实现搜索功能通常涉及监听用户输入、过滤数据并动态显示结果。以下是几种常见实现方式:

基于数组过滤的搜索

const data = ['apple', 'banana', 'cherry', 'date'];
const searchInput = document.getElementById('search-input');
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.join('<br>');
});

对象数组的搜索

const products = [
  { id: 1, name: 'Laptop', category: 'Electronics' },
  { id: 2, name: 'Shirt', category: 'Clothing' }
];

searchInput.addEventListener('input', (e) => {
  const term = e.target.value.toLowerCase();
  const results = products.filter(product => 
    product.name.toLowerCase().includes(term) || 
    product.category.toLowerCase().includes(term)
  );
  renderResults(results);
});

实现模糊搜索

对于更灵活的搜索,可以添加模糊匹配:

function fuzzySearch(text, search) {
  const searchChars = search.toLowerCase().split('');
  const textChars = text.toLowerCase().split('');
  let searchIndex = 0;

  for (let char of textChars) {
    if (char === searchChars[searchIndex]) {
      searchIndex++;
      if (searchIndex === searchChars.length) return true;
    }
  }
  return false;
}

搜索性能优化

对于大型数据集,考虑以下优化方案:

防抖处理

function debounce(func, delay) {
  let timeout;
  return function() {
    clearTimeout(timeout);
    timeout = setTimeout(() => func.apply(this, arguments), delay);
  };
}

searchInput.addEventListener('input', debounce(function(e) {
  // 搜索逻辑
}, 300));

索引优化

// 预先构建搜索索引
const searchIndex = data.map(item => ({
  original: item,
  searchable: item.name.toLowerCase() + ' ' + item.category.toLowerCase()
}));

结合API的远程搜索

当需要从服务器获取搜索结果时:

async function fetchSearchResults(query) {
  try {
    const response = await fetch(`/api/search?q=${encodeURIComponent(query)}`);
    return await response.json();
  } catch (error) {
    console.error('搜索失败:', error);
    return [];
  }
}

searchInput.addEventListener('input', debounce(async (e) => {
  const results = await fetchSearchResults(e.target.value);
  renderResults(results);
}, 500));

前端框架实现示例(React)

在React中实现搜索组件:

function SearchComponent() {
  const [searchTerm, setSearchTerm] = useState('');
  const [results, setResults] = useState([]);

  useEffect(() => {
    const filtered = data.filter(item =>
      item.toLowerCase().includes(searchTerm.toLowerCase())
    );
    setResults(filtered);
  }, [searchTerm]);

  return (
    <div>
      <input 
        type="text" 
        value={searchTerm}
        onChange={(e) => setSearchTerm(e.target.value)}
      />
      <ul>
        {results.map(item => (
          <li key={item.id}>{item.name}</li>
        ))}
      </ul>
    </div>
  );
}

搜索功能增强技巧

高亮匹配文本

function highlightMatch(text, searchTerm) {
  const regex = new RegExp(`(${searchTerm})`, 'gi');
  return text.replace(regex, '<mark>$1</mark>');
}

多字段加权搜索

js实现搜索功能

function advancedSearch(items, term) {
  return items.map(item => {
    let score = 0;
    if (item.name.includes(term)) score += 2;
    if (item.description.includes(term)) score += 1;
    return { ...item, score };
  })
  .filter(item => item.score > 0)
  .sort((a, b) => b.score - a.score);
}

这些方法可以根据具体需求组合使用,构建出适合不同场景的搜索功能实现方案。

标签: 搜索功能js
分享给朋友:

相关文章

jquery js

jquery js

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

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 const…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…

js图片上传实现

js图片上传实现

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/…

js实现复制功能实现

js实现复制功能实现

使用document.execCommand方法(传统方式,已逐渐被弃用) 传统方式通过document.execCommand('copy')实现复制功能,需先选中文本。以下是一个完整示例: fu…