js实现模糊搜索
实现模糊搜索的方法
使用正则表达式进行模糊匹配
通过正则表达式可以实现简单的模糊搜索功能。例如,忽略大小写或部分匹配:
const items = ['Apple', 'Banana', 'Orange', 'Grape'];
const searchTerm = 'ap';
const results = items.filter(item =>
new RegExp(searchTerm, 'i').test(item)
);
console.log(results); // ['Apple']
使用字符串的 includes 方法
对于简单的包含匹配,可以使用字符串的 includes 方法:
const items = ['Apple', 'Banana', 'Orange', 'Grape'];
const searchTerm = 'ap';
const results = items.filter(item =>
item.toLowerCase().includes(searchTerm.toLowerCase())
);
console.log(results); // ['Apple']
使用第三方库 Fuse.js
Fuse.js 是一个强大的模糊搜索库,支持更复杂的模糊匹配逻辑:
const Fuse = require('fuse.js');
const items = ['Apple', 'Banana', 'Orange', 'Grape'];
const options = {
includeScore: true,
threshold: 0.4,
};
const fuse = new Fuse(items, options);
const results = fuse.search('ap');
console.log(results.map(r => r.item)); // ['Apple']
实现 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 items = ['Apple', 'Banana', 'Orange', 'Grape'];
const searchTerm = 'Aple';
const threshold = 2;
const results = items.filter(item =>
levenshteinDistance(item.toLowerCase(), searchTerm.toLowerCase()) <= threshold
);
console.log(results); // ['Apple']
结合拼音搜索
对于中文内容的模糊搜索,可以结合拼音转换:

const pinyin = require('pinyin');
const items = ['苹果', '香蕉', '橙子', '葡萄'];
const searchTerm = 'ping';
const results = items.filter(item => {
const py = pinyin(item, { style: pinyin.STYLE_NORMAL }).join('');
return py.includes(searchTerm.toLowerCase());
});
console.log(results); // ['苹果']






