• <div id="ogoia"><li id="ogoia"></li></div>
  • <div id="ogoia"><div id="ogoia"></div></div>
    <xmp id="ogoia"><li id="ogoia"></li>
    <small id="ogoia"><li id="ogoia"></li></small>
  • <div id="ogoia"><li id="ogoia"></li></div>
  • <menu id="ogoia"></menu>
  • <s id="ogoia"><menu id="ogoia"></menu></s> <small id="ogoia"><div id="ogoia"></div></small><label id="ogoia"></label>
    <menu id="ogoia"><menu id="ogoia"></menu></menu>
    <button id="ogoia"></button>
  • <div id="ogoia"><small id="ogoia"></small></div><xmp id="ogoia"><div id="ogoia"></div>
  • <div id="ogoia"><div id="ogoia"></div></div>
  • <div id="ogoia"></div>
  • <menu id="ogoia"><div id="ogoia"></div></menu>
  • <div id="ogoia"><div id="ogoia"></div></div>
  • <div id="ogoia"><li id="ogoia"></li></div>
  • <div id="ogoia"><div id="ogoia"></div></div>
  • <div id="ogoia"><li id="ogoia"></li></div>
  • <div id="ogoia"><button id="ogoia"></button></div>
  • <div id="ogoia"><li id="ogoia"></li></div>
    <small id="ogoia"><li id="ogoia"></li></small>
    <small id="ogoia"></small>
  • <small id="ogoia"></small>
    <small id="ogoia"><div id="ogoia"></div></small>
  • <div id="ogoia"><button id="ogoia"></button></div>
  • <small id="ogoia"><li id="ogoia"></li></small><small id="ogoia"><li id="ogoia"></li></small>
  • <div id="ogoia"><li id="ogoia"></li></div>
  • <div id="ogoia"><li id="ogoia"></li></div>
  • <div id="ogoia"><button id="ogoia"></button></div>

    前端数据处理

    "any application that can be written in JavaScript, will eventually be written in JavaScript" -- by Jeff Atwood
    ? ? 事情的起因是这样的,业务中有一个详情比价页面,需要爬虫抓取数据传给前端展示给用户,因为爬虫抓取数据是需要一定的时间的,以往的作法是做ajax的简单的长轮询,每隔2秒就请求一次
    后台JAVA的接口,请求6次,最终显示的是第六次的结果。JAVA后台负责接收前端请求,推动python后台爬虫,接收爬虫数据并排序整理,返回给前端接口。此方案效果非常不好,用时久,数据可靠性低
    等问题一直阴魂不散。所以才有了这次的推送改版。这次推送改版的方案主要改动是不用ajax进行请求了,新增了一个MQTT通讯服务器。(MQTT简介https://github.com/mcxiaoke/mqtt),前端和爬虫通过MQTT服务器进行通讯,前端做数的排序
    整理。我认为对于前端来说本质上是使用webSocket进行了通讯,只不过是套上了MQTT的外衣。对于前端来说,需要做简单的数据处理,例如排序,查重等,非常好!
    ? ? ①背景介绍完毕,前端用什么进行排序或者说查重呢?当然是Js啦(?),先说去重吧,去重我是跟后台JAVA的哥们聊天得到的启发,要用到es6的Set集合,具体方法如下:
    ? ? //array表示需要去重的原数组,param表示去重的依据是数组中的一项的属性,info表示需要对比的属性
    ? ? findSameInfo(array,param,info){
    ?? ??? ??? ?let _this = this
    ?? ??? ??? ?let result = true
    ?? ??? ??? ?let checkSet = new Set()
    ?? ??? ??? ?array.map((item)=>{
    ?? ??? ??? ??? ?checkSet.add(item[param])
    ?? ??? ??? ?})
    ?? ??? ??? ?let oldLen = checkSet.size
    ?? ??? ??? ?checkSet.add(info[param])
    ?? ??? ??? ?let newLen = checkSet.size
    ?? ??? ??? ?if(oldLen == newLen){//说明加入set中集合有重复的数据源,所以size没变,数据重复
    ?? ??? ??? ??? ?result = false
    ?? ??? ??? ?}
    ?? ??? ??? ?return result
    ?? ?},
    ? ? 使用方法如下:
    ? ? 假设要对比名字,价格,id,完全相同则为重复数据
    ? ??
    ? ? let checkName = this.findSameInfo(checkArray,'name',info)
    ? ? let checkPrice = this.findSameInfo(checkArray,'price',info)
    ? ? let checkId = this.findSameInfo(checkArray,'id',info)
    ? ? if(!checkName && !checkPrice && !checkId){
    ? ? ? ? //数据重复,不执行下面的操作
    ? ? ? ? return
    ? ? }
    ? ? checkArray.push(info)

    ? ? ②排序的方法网上有挺多,我就不多哔哔了,排序用的是改良版的冒泡排序,具体方法如下:
    ? ? (算法文章推荐https://juejin.im/post/57dcd394a22b9d00610c5ec8,我只会冒泡和选择排序,所有选了个喜欢的)
    ? ? ? ? //冒泡排序算法
    ? ? ? ? //方法需要传入2个参数,第一个参数是需要排序的数组,第二个参数是排序的依据是数组中的一项的属性
    ?? ??? ?arrayBubbleSort(array,param){
    ?? ??? ??? ?if(Object.prototype.toString.call(array).slice(8,-1) !== 'Array'){//若array不是数组则不执行之后的操作
    ?? ??? ??? ??? ?return
    ?? ??? ??? ?}
    ?? ??? ??? ?//原始冒泡排序
    ?? ??? ??? ?// for (let j = 0; j < array.length - 1; j++) {
    ?? ??? ??? ?// ?? ??? ?// 这里要根据外层for循环的 j,逐渐减少内层 for循环的次数
    ?? ??? ??? ?// ?? ??? ?for (let i = 0; i < array.length - 1 - j; i++) {
    ?? ??? ??? ?// ?? ??? ??? ?if (array[i][param] > array[i + 1][param]) {
    ?? ??? ??? ?// ?? ??? ??? ??? ?let temp = array[i];
    ?? ??? ??? ?// ?? ??? ??? ??? ?array[i] = array[i + 1];
    ?? ??? ??? ?// ?? ??? ??? ??? ?array[i + 1] = temp;
    ?? ??? ??? ?// ?? ??? ??? ?}
    ?? ??? ??? ?// ?? ??? ?}
    ?? ??? ??? ?// }
    ?? ??? ??? ?
    ?? ??? ??? ?//改进冒泡排序
    ?? ??? ??? ?console.time(`冒泡排序耗时`)
    ?? ??? ??? ?let i = array.length - 1//初始化
    ?? ??? ??? ?let temp = null
    ?? ??? ??? ?while(i>0){
    ?? ??? ??? ??? ?let pos = 0 //记录位置,记录位置之后的数据不需要交换位置
    ?? ??? ??? ??? ?for(let j =0;j<i;j++){
    ?? ??? ??? ??? ??? ?if(array[j][param] && array[j+1][param] && (array[j][param] > array[j+1][param])||array[j][param] == 0 || array[j][param] == '' || array[j][param] == null || array[j][param] == 'null'){
    ?? ??? ??? ??? ??? ??? ?pos = j //记录交换位置
    ?? ??? ??? ??? ??? ??? ?temp = array[j]
    ?? ??? ??? ??? ??? ??? ?array[j] = array[j+1]
    ?? ??? ??? ??? ??? ??? ?array[j+1] = temp
    ?? ??? ??? ??? ??? ?}
    ?? ??? ??? ??? ?}
    ?? ??? ??? ??? ?i = pos //下一次排序更新位置
    ?? ??? ??? ?}
    ?? ??? ??? ?console.timeEnd(`冒泡排序耗时`)
    ?? ??? ??? ?return array
    ?? ??? ?}

    展开阅读全文

    没有更多推荐了,返回首页

    加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】|