我相信很多人Web开发人员都遇到过前端数据联想输入的问题。

例如:百度搜索时会联想出你想要检索的信息。

前端查询将字段给后端python 前端查询功能_数据


像这样的需求可能还是相当比较简单的,因为这种输入一般输入的速度并不是很快,通过keyup+ajax是可以满足要求的。

但是如果是财务软件,或者专有软件,普通办公人员都习惯使用小键盘进行快速输入。这个时候用keyup + ajax很多情况下就很难满足用户的需要了。而且用户的输入速度很快,无形中就会增加ajax发送的次数,对数据库查询和应用服务器都会产生不必要的负载压力。

那有没有相对较好的快速检索的方法呢?那我今天就提供一个浏览器前端快速检索的解决方案和实现的思路。

先上代码:

var search = function(config){
	var that = {
		conf:{
			regexp:"[\\d]+",
			source:null
		},
		toJson:function(val){
			val = val.replace(/[\r]/g,'').replace(/[\n]/g,'');
			return (new Function("return " + val))() || {};
		},
		tmpsource:{
			str:null,
			map:null,
			tplist:[]
		},
		init:function(conf){
			//初始化配置
			for(var item in conf){
				that.conf[item] = conf[item];
			}
			//反序列化数据存储到临时数据区
			that.tmpsource.map = that.toJson(that.conf.source || "{}");
			//构建结构化字符串
			for(var item in that.tmpsource.map){
				that.tmpsource.tplist.push(item);
			}
			that.tmpsource.str = that.tmpsource.tplist.join("|");
			that.tmpsource.tplist = null;
		}
	};
	that.init(config);
	return {
		select:function(fdstr,top){
			var reg = new RegExp("("+ that.conf.regexp + fdstr + that.conf.regexp + "|)","g"),
				tmp = that.tmpsource.str.match(reg),
				list = [];
			for(var i = 0,j = 0,len = tmp.length,jlen = top ? top : len; i < len && j < jlen; i++){
				if(tmp[i] != ""){
					list.push(that.tmpsource.map[tmp[i]]);
					j++;
				}
			}
			return list;
		}
	}
};

那如何使用呢?上代码:

var se = new search({
	source:"{'12345678':{'name':'12345678','id':'12345678'},'12645678':{'name':'12645678','id':'12645678'},'13645678':{'name':'13645678','id':'13645678'}}"
});
for(var i = 0; i < 10000; i++){
	var list = se.select("45",10);
	console.log(list);
}

search的构造函数有两个参数:
source是一个json字符串,由key和value组成,其中key是需要检索的值,value是key值对应的对象数据。
regexp是一个正则表达式。是用来匹配key值的。
实例化后的对象只有一个select函数,该函数有两个参数:
fdstr:该参数是要模糊匹配的字符串。
top:该参数是匹配前多少条数据。
该方案的总体实现思路是这样的,接收服务端响应的json数据后,将key值转换为内部特定格式。使用正则表达式对数据进行正则分组匹配,然后根据匹配的情况,通过key去map中获取对应的数据。
经过测试,10000次循环匹配可以很快完成,效率要比ajax快很多倍。
但是需要注意的点事,服务端响应的数据的key要提前排序好,该代码中没有添加前端排序的代码实现。个人认为前端排序意义也不大,服务端进行排序是比较简单的一件事情。
好了,今天就写这些了,欢迎大家使用,提修改意见。