提示:可以跳过闲言,直接上干货,这里谈谈我的思路是如何诞生的。
昨天我开发的内容轮到输入搜索,从UI上看:input输入框 + button搜索按钮,就实现了。关键在于背后如何实现对数据的搜索功能,常见方法:搜索内容给到后端,sql语句进行模糊查询,将结果返回前端,再显示。然而情况有所不同,如果后端数据库的所有信息,在页面created时就全部给前端了呢?这种情况下,如果使用常见,未免有点浪费时间,但是前端的JS如何实现模糊查询?于是我和舍友讨论前端实现模糊查询的问题时,我们以百度为例,思考百度的搜索功能是如何实现的呢?我当时开玩笑似的说“百度说不定是把我们输入的搜索内容全部打散成字符数组,然后进行的匹配”。第二天,我继续做开发时,发现网上纯前端实现模糊查询的我都看不懂(俺这个阅读能力不行),所以我决定就按照我昨天的思路做做尝试,于是就有了今天这篇博客。
提示:以下是本篇文章正文内容,下面案例可供参考
核心思想: 将输入的内容拆分成单个字符形成搜索数组,然后利用indexOf查看被查询对象与这个搜索数组的重合度/匹配度(计算每个字符在被查询对象中出现的次数),并做好记录,之后就是排序和显示。
具体步骤:
注意:
注意:
var selectList=this.selectContent.split('');
this.testPaperListPart[i].matchDegree=0; // 建立匹配度,初始为0
举例:
for(var i=0;i<this.testPaperListPart.length;i++){
// 建立匹配度,初始化为0
this.testPaperListPart[i].matchDegree=0;
// 检测匹配度
for(var k=0;k<selectList.length;k++){
// 利用indexOf,记录每个字符在testName中出现的个数,并记录到匹配度
var index = this.testPaperListPart[i].testName.indexOf(selectList[k]);
while(index!=-1){
this.testPaperListPart[i].matchDegree++;
index=this.testPaperListPart[i].testName.indexOf(selectList[k],index+1);
}
}
}
// 根据匹配度排序
this.testPaperListPart.sort(function(a, b){return b.matchDegree - a.matchDegree});
// 删除匹配度为0的试题、删除matchDegree属性
var k=0;
while (k<this.testPaperListPart.length){
// 删除匹配度为0的试题
if(this.testPaperListPart[k].matchDegree==0){
this.testPaperListPart.splice(k,1);
continue;// 直接进入下一个循环
}
Reflect.deleteProperty(this.testPaperListPart[k],'matchDegree'); // 删除matchDegree属性
k++;
}