/** * SearchFilter - PFP编号搜索筛选类 * 支持模糊匹配和精确匹配两种搜索模式 */ class SearchFilter { constructor() { this.searchTerm = ''; this.searchMode = 'fuzzy'; // 'fuzzy' 或 'exact' } /** * 设置搜索关键词 * @param {string} term - 搜索关键词 */ setSearchTerm(term) { this.searchTerm = term; } /** * 设置搜索模式 * @param {string} mode - 'fuzzy' 或 'exact' */ setSearchMode(mode) { this.searchMode = mode; } /** * 获取当前搜索关键词 * @returns {string} */ getSearchTerm() { return this.searchTerm; } /** * 获取当前搜索模式 * @returns {string} */ getSearchMode() { return this.searchMode; } /** * 检查搜索是否激活 * @returns {boolean} */ isActive() { return this.searchTerm.trim() !== ''; } /** * 清除搜索 */ clear() { this.searchTerm = ''; } /** * 根据编号筛选PFP数据 * @param {Array|Object} allData - 所有PFP数据 * @param {string} searchTerm - 搜索关键词 * @param {string} mode - 搜索模式 ('fuzzy' 或 'exact') * @returns {Array} 筛选后的数据数组 */ filterByNumber(allData, searchTerm, mode) { if (!searchTerm || searchTerm.trim() === '') { // 如果没有搜索词,返回所有数据 return Array.isArray(allData) ? allData : Object.values(allData); } const term = searchTerm.trim(); const filtered = []; // 将数据转换为数组(如果是对象) const dataArray = Array.isArray(allData) ? allData : Object.values(allData); for (const pfp of dataArray) { const numStr = pfp.num.toString(); if (mode === 'exact') { // 精确匹配:编号必须完全相等 if (numStr === term) { filtered.push(pfp); } } else { // 模糊匹配:编号包含搜索词即可 if (numStr.includes(term)) { filtered.push(pfp); } } } // 按编号排序 return filtered.sort((a, b) => a.num - b.num); } }