最近无聊写了个简单的关键词搜索代码,啧啧啧

实现的效果:

用到的工具代码:

/*** 公用方法*/
var utils={//获取滚动条的高度getScrollTop:function(){let scrollTop=0;if(document.documentElement&&document.documentElement.scrollTop){scrollTop=document.documentElement.scrollTop;}else if(document.body) {scrollTop=document.body.scrollTop;}return scrollTop;},//获取标签ele:function(text){if(text!=null&text!=""){if(text.length>1){if (/^#[a-zA-Z0-9_]*$/.test(text)){return document.getElementById(text.substring(1,text.length));}else if(/^\.[a-zA-Z0-9_]*$/.test(text)){return document.getElementsByClassName(text.substring(1,text.length));}else{return document.getElementsByTagName(text);}}}return null;},//设置文本框的最大输入长度inputTextLength:function(ele,textLength){let py=false;ele.addEventListener("input",function(){if(!py){sub();}});ele.addEventListener("compositionstart",function(){py=true;});ele.addEventListener("compositionend",function(){py=false;sub();});function sub(){let text=ele.value;if(text.length>=length){ele.value=text.substring(0,length);}}},//设置cssaddCss:function(el,cssStyles){if(typeof el=="object"){let css={};let oldCss=el.getAttribute("style");if(oldCss!=null){let oldCsss=oldCss.split(";");for(let i=0;i<oldCsss.length;i++){let keyAndValue=oldCsss[i];if(keyAndValue!=""){let k=keyAndValue.substring(0,keyAndValue.indexOf(":"));let v=keyAndValue.substring(keyAndValue.indexOf(":")+1,keyAndValue.length);css[k]=v.trim();}}}for(cssStyle in cssStyles){css[cssStyle]=cssStyles[cssStyle];}if(JSON.stringify(css)!="{}"){oldCss = "";for(let c in css){oldCss+=c+":"+css[c] +";";}}el.setAttribute("style",oldCss);}},//创建标签createElement:function (eleName,attrs,write,parseEle){if(typeof eleName=="string"){let ele=document.createElement(eleName);if(typeof attrs=="object"&attrs!=null){for(let attr in attrs){ele.setAttribute(attr, attrs[attr]);}}if(typeof write=="object"&write!=null){for(let text in write){if(text=="text"){this.InnerText(ele, write[text]);}else if(text=="html"){ele.innerHTML = write[text];}else if(text=="value"){ele.value = write[text];}}}if(typeof parseEle=="object"&parseEle!=null){parseEle.appendChild(ele);}return ele;}},//分割数组splitArray:function (array, arrayLength){let VarTempArray = [];let temp = [];for(let i=0;i<array.length;i++){temp.push(array[i]);if(i%arrayLength==(arrayLength-1)||i==(array.length-1)){VarTempArray.push(temp);temp = [];}}return VarTempArray;},//时间格式化dateTimeFormat:function(timeStamp,timeFormat){let date=new Date(timeStamp);let y=date.getFullYear();let M=(date.getMonth()+1<10?'0'+(date.getMonth()+1):date.getMonth()+1);let d=date.getDate()<10?'0'+date.getDate()+'':date.getDate()+'';let h=date.getHours()<10?'0'+date.getHours():date.getHours();let m=date.getMinutes()<10?'0'+date.getMinutes():date.getMinutes();let s=date.getSeconds()<10?'0'+date.getSeconds():date.getSeconds();if(timeFormat.indexOf("yyyy")!=-1||timeFormat.indexOf("YYYY")!=-1){timeFormat=timeFormat.replace(new RegExp(/yyyy|YYYY/g),y);}if(timeFormat.indexOf("MM")!=-1){timeFormat=timeFormat.replace(new RegExp(/MM/g),M);}if(timeFormat.indexOf("dd")!=-1||timeFormat.indexOf("DD")!=-1){timeFormat=timeFormat.replace(new RegExp(/dd|DD/g),d);}if(timeFormat.indexOf("hh")!=-1||timeFormat.indexOf("HH")!=-1){timeFormat=timeFormat.replace(new RegExp(/hh|HH/g),h);}if(timeFormat.indexOf("mm")!=-1){timeFormat=timeFormat.replace(new RegExp(/mm/g), m);}if(timeFormat.indexOf("ss")!=-1||timeFormat.indexOf("SS")!=-1){timeFormat=timeFormat.replace(new RegExp(/ss|SS/g),s);}return timeFormat;},//获取元素的节点getEle:function(element,text){if(text=="子节点"){return element.children;}else if(text=="父节点"){return element.parentNode;}else if(text=="下一个节点"){return element.nextSibling;}else if(text=="上一个节点"){return element.previousSibling;}else if(text=="第一个子节点"){return element.firstChild;}else if(text=="最后一个子节点 "){return element.lastChild;}else if(text=="兄弟节点"){let r = [];let n = element.parentNode.firstChild;for(;n;n=n.nextSibling){if(n.nodeType===1&&n!==element){r.push(n);}}return r;}else{return "输入错误!";}},//动态添加jsaddDynamicJS:function(src, callback){let script=document.createElement("script");script.setAttribute("type", "text/javascript");script.src=src;script.charset='utf-8';let first=document.body.firstChild;document.body.insertBefore(script,first);if(callback!=undefined){script.onload=function(){callback();}}},//ascll码与字符间的转换ascll:function(text,isAscll){if(isAscll==true){return String.fromCodePoint(text);}else{return text.charCodeAt();}},//判断页面是否被嵌入iframe里面isIframeView:function(){return window.self===window.top;},//清除指定的class样式removeClass:function(element,className){let cName=element.className;let arr=cName.split(" ");let newArr=[];for(let i=0;i<arr.length;i++){if(arr[i]!=className){newArr.push(arr[i]);}}let str=newArr.join("");element.className=str;},//深拷贝数组copyArray:function(array){return array.slice(0,array.length);},//纯数组排序sort:function(array){return array.sort(function(a, b){return (a + '').localeCompare(b + '');});},//按照数组中的某个属性排序attrSort:function(array,attr,type){return array.sort(function(a,b){let value1=a[attr];let value2=b[attr];if(type==true){value1=b[attr];value2=a[attr];                }if(typeof value1=="number"&&typeof value2=="number"){return value1-value2;}else{return (value1+'').localeCompare(value2+'');}});},//按照数组元素/元素的属性(文本)长度排序("默认升序")textLengthSort:function(array,attr,type){var array=array.map(obj=>({raw:obj,len:obj[attr].length}));if(type==true){return array.sort((n,p) => n.len - p.len).map(i => i.raw);}return array.sort((p, n) => n.len - p.len).map(i => i.raw);},//随机数 (lower 最小值,upper 最大值)random:function(lower, upper) {return Math.floor(Math.random() * (upper - lower)) + lower;},//判断是否为万恶的IEisIE:function() {if (window.ActiveXObject || "ActiveXObject" in window){return true;}else{return false;}},//判断传入参数是否为dom实例isElement:function(obj){return (typeof HTMLElement === 'object') ?(obj instanceof HTMLElement):!!(obj && typeof obj === 'object' && (obj.nodeType === 1 || obj.nodeType === 9) && typeof obj.nodeName === 'string');},//比较两个对象是否相同equalObject:function(x, y) {var i, l, leftChain, rightChain;function compare2Objects(x, y) {var p;if (isNaN(x) && isNaN(y) && typeof x === 'number' && typeof y === 'number') {return true;}if (x === y) {return true;}if ((typeof x === 'function' && typeof y === 'function') ||(x instanceof Date && y instanceof Date) ||(x instanceof RegExp && y instanceof RegExp) ||(x instanceof String && y instanceof String) ||(x instanceof Number && y instanceof Number)) {return x.toString() === y.toString();}if (!(x instanceof Object && y instanceof Object)) {return false;}if (x.isPrototypeOf(y) || y.isPrototypeOf(x)) {return false;}if (x.constructor !== y.constructor) {return false;}if (x.prototype !== y.prototype) {return false;}if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1) {return false;}for (p in y) {if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {return false;} else if (typeof y[p] !== typeof x[p]) {return false;}}for (p in x) {if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {return false;} else if (typeof y[p] !== typeof x[p]) {return false;}switch (typeof(x[p])) {case 'object':case 'function':leftChain.push(x);rightChain.push(y);if (!compare2Objects(x[p], y[p])) {return false;}leftChain.pop();rightChain.pop();break;default:if (x[p] !== y[p]) {return false;}break;}}return true;}if (arguments.length < 1) {return true;}for (i = 1, l = arguments.length; i < l; i++) {leftChain = [];rightChain = [];if (!compare2Objects(arguments[0],arguments[i])){return false;}}return true;},//是否为数组isArray:function(o){return Object.prototype.toString.call(o)== '[object Array]';},//字符串搜索(exact=false时为模糊搜索)search:function(data, text, exact) {let result = new Array;(function() {dataType();_search();}());function dataType() {let t = typeof data;if(t == "string") {let temp = data;data = new Array;data.push(temp);} else if(t == "object" && utils.isArray(data)) {console.log("data参数类型为数组.");} else {console.log("data参数类型为字符串或者数组!");}}function search_0() {let i = 0,len = data.length,arr=text.split(""),l=arr.length;for(i; i < len; i++) {let d=data[i],dl=d.length,j=0,isOkNumber=0,index=0;for(j;j<l;j++){let a=arr[j],_index=d.indexOf(a,index);if((dl-j)<(l-isOkNumber)){break;}if(_index>=0){isOkNumber++;index=_index;}if(isOkNumber==l){result.push(d);break;}}}}function search_1() {let i = 0,len = data.length;for(i; i < len; i++) {let d = data[i];if(d == text) {result.push(d);}}}function _search() {exact == false ? search_0() : search_1();}return result;},//获得字符串的字节长度getBytesLength:function(text){var totalLength = 0;var charCode;for (var i = 0; i < text.length; i++){charCode = text.charCodeAt(i);if (charCode < 0x007f){totalLength++;} else if ((0x0080 <= charCode) && (charCode <= 0x07ff)){totalLength += 2;} else if ((0x0800 <= charCode) && (charCode <= 0xffff)){totalLength += 3;} else{totalLength += 4;}}return totalLength;},//迭代数组iterator:function(arr){let index=-1,len=-1;(function(){index=0;len=arr.length;}());this.hasNext=function(){return len>index&&len>0?true:false;};this.next=function(){return index<len&&len>0?{"index":index,"data":arr[index++]}:null;};},//获得占用内存getMemory:function(){if(window.performance){return Math.round(window.performance.memory.usedJSHeapSize*100/1024)/100;}return -1;},//读取本地文件readerFile:function(input,fun) {if (window.FileReader) {let file = input.files[0];filename = file.name.split(".")[0];let reader = new FileReader();reader.onload = function() {fun(this.result);};reader.readAsText(file);}else if (typeof window.ActiveXObject != 'undefined'){let xmlDoc;xmlDoc = new ActiveXObject("Microsoft.XMLDOM");xmlDoc.async = false;xmlDoc.load(input.value);fun(xmlDoc.xml);}else if (document.implementation && document.implementation.createDocument) {let xmlDoc;xmlDoc = document.implementation.createDocument("", "", null);xmlDoc.async = false;xmlDoc.load(input.value);fun(xmlDoc.xml);} else {fun(null);}},//定位光标到最后positioningCursor:function(element){var range = document.createRange();range.selectNodeContents(element);range.collapse(false);var sel = window.getSelection(); sel.removeAllRanges();sel.addRange(range);return sel.anchorOffset;},//格式化文件大小formatFileSize:function(fileSize){let fSizeType=["B","K","M","G","T"];function _format(fileSize,index){index=index==undefined?0:index;if(fileSize>=1024&&index<fSizeType.length-1){return _format((fileSize/1024).toFixed(2),++index)}return fileSize+fSizeType[index];}return _format(fileSize,0);},//分词split:function(text,charset,maxLen){if(maxLen==undefined){maxLen=5;}//中文分词function spiltString_UTF8(text){var return_array=new Array,text_array=text.split(""),len=text_array.length,_text="",index=0;for(index;index<len;index++){_text=text_array[index];if(verifyUtils.isChinese(_text)){return_array.push(_text);}else{var _len=return_array.length;if(_len>=1&&return_array[_len-1]!=null){return_array.push(null);}}}return splitString(return_array);}function splitString(array){var i=0,len=array.length,return_chars=new Array;for(i;i<len;i++){var _char=array[i];if(_char!=null){var _i=i,_text=_char;for(_i;_i<len;_i++){var _c=array[_i];if(_c!=null){if(i!=_i){_text=_text+_c;}if(!return_chars.includes(_text)){return_chars.push(_text);if(_text.length==maxLen){break;}}}else{break;}}}else{continue;}}return return_chars;}if(charset=="utf-8"||charset=="UTF-8"){return spiltString_UTF8(text);}}
}

第一版:

/*模拟淘宝关键词搜索arrayData:标题数据例如:[{id:0,text:"测试文本"}]//实现功能://按照搜索词长度对结果集进行排序 √//对结果集按照自定义属性进行排序 ×//对结果集按照搜索词频进行排行   ×//按照禁用词剔除无用关键词       ×
*/
function search_system(arrayData){var max_search_text_length=8;//最大搜索文本,超出此长度不再使用关键词搜索,进行精准搜索var search_Text=new Array;//记录搜索记录var search_result_Texts=[];//记录上一次搜索的内容/*搜索text:输入的搜索文本*/this.search=function(text){var search_text_length=search_Text.length;var search_go=search_text_length>0?(search_Text[search_text_length-1]==text):false;if(!search_go){var result_Array=new Array;search_Text.push(text);if(text.length>max_search_text_length){for(var i=0;i<arrayData.length;i++){var obj=arrayData[i];if(text==obj["text"]){result_Array.push([obj["id"]]);result_Array.push([obj["text"]]);}}search_result_Texts=result_Array;return result_Array;}result_Array=_search(text)search_result_Texts=result_Array;return result_Array;}return search_result_Texts;}//关键词搜索function _search(text){var result_array_id=new Array;var result_array_text=new Array;var array=utils.split(text,"utf-8",max_search_text_length);array=array.map(i => ({raw: i, len: i.length})).sort((p, n) => n.len - p.len).map(i => i.raw)var _array=splitArray(arrayData);var i=0,len=array.length,len1=_array.length;for(i;i<len;i++){var _text=array[i],j=0;for(j;j<len1;j++){var o=_array[j];var search_text=o["text"];if(search_text==_text){var indexs=o["ids"],k=0;for(k;k<indexs.length;k++){var indexAddress=indexs[k];if(result_array_id.indexOf(indexAddress)==-1){if(search_text==text){result_array_id.unshift(indexAddress);result_array_text.unshift(_text);                }else{result_array_id.push(indexAddress);result_array_text.push(_text);}}}}}}return [result_array_id,result_array_text];}//分割关键词function splitArray(textArray){var search_Array=new Array;for(var i=0;i<textArray.length;i++){var texts=textArray[i];var array=utils.split(texts["text"],"utf-8",max_search_text_length-2);for(var j=0;j<array.length;j++){var len=search_Array.length,x=0,text=array[j],isExist=false;for(x;x<len;x++){var _o=search_Array[x];if(text==_o["text"]){_o["ids"].push(texts["id"]);isExist=true;}}if(!isExist){search_Array.push({"text":text,"ids":[texts["id"]]});}}}return search_Array;}
}

第二版:

/*模拟淘宝关键词搜索(返回结果加上词频统计)arrayData:所有的数据(必须含有id这一项)  例如:[{"id":0,"name":"tome"},{"id":0,"name":"tome"}...]attr:搜索词的属性名   例如:"name"uselessKeywords:无用关键词,提高检索准确度以及效率    例如:["的","是","我"...]
*/
//实现功能:
//按照搜索词长度对结果集进行排序 √
//对结果集按照自定义属性进行排序 ×
//对结果集按照搜索词频进行排行   ×
//按照禁用词剔除无用关键词       √
function search_System(arrayData,searchAttr,uselessKeywords){var max_search_text_length=8;//最大搜索词长度,超出长度使用精准搜索var text_array=new Array;//词频集var search_Text_Array=new Array;//历史搜索词集var result_search_array=null;//返回结果对象集//初始化(function(){split_Array();}())//从数据集中提取搜索词function split_Array(){var i=0,len=arrayData.length;for(i;i<len;i++){var text=arrayData[i][searchAttr];split_Data(i,text);}}this.search=function(text){var len=search_Text_Array.length;if(len==0||search_Text_Array[len-1]!=text){search_Start(text);}return result_search_array;}//开始搜索function search_Start(text){//实例化返回结果集result_search_array=new Array;var data_array=new Array;//临时数据集if(isNull(text)){//对检索词进行分词获得检索词集var search_Array=utils.split(text,"utf-8",max_search_text_length-2);var i=0,len=search_Array.length;//对检索词长度进行排序search_Array=search_Array.map(i => ({raw: i, len: i.length})).sort((p, n) => n.len - p.len).map(i => i.raw);for(i;i<len;i++){//获取每一个检索词对象var obj=search_Array[i];//对每一个检索词对象进行检索var ids=search_ObjectToArray(obj);var j=0,_len=ids.length;for(j;j<_len;j++){var _obj=ids[j];if(data_array.indexOf(_obj)==-1){data_array.push(_obj);var obj_data=select_id_Array(_obj);obj_data["search_text"]=obj;if(text==obj_data["text"]){result_search_array.unshift(obj_data);}else{result_search_array.push(obj_data);}}}}}}//根据id从原数组查询数据function select_id_Array(id){var i=0,len=arrayData.length;for(i;i<len;i++){var obj=arrayData[i];if(obj["id"]==id){return obj;}}return null;}//搜索检索词对象function search_ObjectToArray(obj){var i=0,len=text_array.length;for(i;i<len;i++){var _obj=text_array[i];var text=_obj["text"];if(text==obj){return _obj["ids"];}}return [];}//分词临时数据集function split_Data(index,text){//获得数据集的临时分词集var temp_data_array=utils.split(text,"utf-8",max_search_text_length-2);var i=0,len=temp_data_array.length;for(i;i<len;i++){//获得分词集对象var obj=temp_data_array[i];//进行词库统计/词频统计data_statistics(index,obj);}}//进行词库统计/词频统计function data_statistics(index,obj){//剔除禁用词if(uselessKeywords==undefined||uselessKeywords.indexOf(obj)==-1){var len=text_array.length;if(len>0){var i=0,isCreate=false;//词频插入\修改for(i;i<len;i++){var _obj=text_array[i];var ids=_obj["ids"];var text=_obj["text"];if(text==obj){if(ids.indexOf(index)==-1){_obj["ids"].push(index);_obj["size"]+=1;isCreate=true;break;}}}if(!isCreate){text_array.push({"text":obj,"ids":[index],"size":1});}}else{text_array.push({"text":obj,"ids":[index],"size":1});}}}//空值判断function isNull(text){return (text==undefined)||(text==null)||(text.trim()=="")?false:true;}
}

用到的工具代码:

JS实现淘宝提取关键词搜索相关推荐

  1. 手机淘宝APP关键词搜索采集方案

    自2018年12月中旬之后,淘宝升级了反爬虫策略,淘宝Web版必须要登录之后才能使用搜索功能(直接搜索会被重定向到登录界面,登录之后才能看到搜索结果).然而登录之后如果访问稍微频繁,就会出现滑块验证码 ...

  2. 淘宝/天猫关键词搜索采集接口分析商品价格走势(商品列表,商品销量,商品价格,分类ID采集精准商品数据)接口代码对接流程

    淘宝/天猫关键词搜索采集接口分析商品价格走势(商品列表,商品销量,商品价格)接口代码对接流程如下: 1.公共参数 名称 类型 必须 描述(接口代码教程wx19970108018) key String ...

  3. 淘宝/天猫关键词搜索店铺列表 API接口,店铺列表API接口,店铺商品API接口

    一.淘宝/天猫关键词搜索店铺列表 API接口,店铺列表API接口,店铺商品API接口参数如下: 1.公共参数: 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在UR ...

  4. 淘宝按关键词搜索天猫商品接口调用展示

    以下为淘宝某商品的调用数据作为展示案例 更多API调用示例展示及获取Key和secret请移步以下内容查看 [登录 - 跨境电商平台接口提供商 数据采集公司 数据接口定制服务 企业级数据服务商] { ...

  5. 淘宝/天猫关键词搜索最新接口

    onebound.taobao.item_search 公共参数 请求地址:https://open.onebound.cn/test/?api_type=taobao&api_name=it ...

  6. 淘宝API关键词搜索接口调用示例

    以下是行业内了解到的一些情况,本帖只展示部分代码,需要更多API调试请移步注册API账号 {     "items": {         "page": &q ...

  7. 淘宝按关键词搜索示例

    以下是行业内了解到的一些情况,本帖只展示部分代码,需要更多API调试请移步注册API账号}{{     "items": {         "page": & ...

  8. JS仿淘宝网顶部的导航菜单

    代码简介: JS仿淘宝网顶部的导航菜单.整合了购物车,收藏夹,搜索,搜索,网站导航等功能的导航. 代码内容: <!DOCTYPE html PUBLIC "-//W3C//DTD XH ...

  9. 使用selenium模块自动打开淘宝并进行搜索

    Selenium是一个自动化测试工具,可以驱动浏览器器执行特定的动作,如点击,下拉等.可以用来进行模拟人工操作浏览器进行测试,爬虫等. 如果没有安装环境可以先pip install Selenium, ...

最新文章

  1. js MD5加密处理
  2. KVM和qemu网络TAP模式桥接的设置
  3. chm文件无法正常显示
  4. 服务器排障 之 nginx 499 错误的解决
  5. 如何看懂源代码–(分析源代码方法)
  6. 25岁“天才少年”曹原再发一篇Nature!1个月时间内的第二篇!
  7. 网络编程t-io介绍
  8. 三坐标测量圆直径_基于三坐标测量机的渐开线齿轮,测量方法
  9. ajax 服务器怎么响应,Ajax 接收服务器返回的json响应方法
  10. java sec_java.security文件
  11. IDEA插件开发(简单案例助你快速入门)
  12. 2019数学建模F:数字货币存在是否合理?提供一些思路供思考
  13. 讯飞AIUI集成语音语义的21003错误
  14. 计算机专业课只考c语言的学校,【择校必看】十三所计算机专业课只考数据结构的985院校!...
  15. 怎么旋转DIV 45度 要以中心旋转
  16. 浅谈大数据如何管理与分析
  17. 亿级万物互联新时代的物联网消息中间件EMQX调研
  18. 永信至诚蓝莲花绽放2016“启明星辰杯”四川大学生信息安全技术大赛
  19. 【C++】递推动态规划基础入门
  20. Halcon学习(1)初识Halcon HDevelop

热门文章

  1. Error:Execution failed for task ':app:compileDebugNdk' 解决方法
  2. SPI与SSP的区别?
  3. 慎用三极管驱动继电器的线圈电路
  4. python小游戏——像素鸟代码开源
  5. 【论文|复现]Vertebra-Focused Landmark Detection For Scoliosis Assessment
  6. 解决mysql报错ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'
  7. CAD看图软件如何画线?
  8. centos7 高并发调优
  9. 众鑫汇兑ios APP 技术支持
  10. coordinate systems