你的位置:首页 > Java教程

[Java教程]JS求多个数组的重复数据


今天朋友问了我这个问题:JS求多个数组的重复数据

 注:

  1.更准确的说是只要多个数组中有两个以上的重复数据,那么这个数据就是我需要的

  2.单个数组内的数据不存在重复值(当然如果有的话,你可以去重)

  3.耗时问题,这一点很重要

 

源代码:

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4   <meta charset="UTF-8"> 5   <title>获取多个数组中的重复数据</title> 6 </head> 7 <body> 8   <script type="text/javascript"> 9  10     //计算用时 11     function useTime(date1,date2){ 12        13       var date3=date2.getTime()-date1.getTime() //时间差的毫秒数 14  15  16       //计算出相差天数 17       var days=Math.floor(date3/(24*3600*1000)) 18        19       //计算出小时数 20  21       var leave1=date3%(24*3600*1000)  //计算天数后剩余的毫秒数 22       var hours=Math.floor(leave1/(3600*1000)) 23       //计算相差分钟数 24       var leave2=leave1%(3600*1000)    //计算小时数后剩余的毫秒数 25       var minutes=Math.floor(leave2/(60*1000)) 26       //计算相差秒数 27       var leave3=leave2%(60*1000)   //计算分钟数后剩余的毫秒数 28       var seconds=Math.round(leave3/1000) 29       return "用时:"+days+" "+hours+":"+minutes+":"+seconds+" "+leave3%1000;//+"''"; 30     } 31  32  33     //返回min,max之间的数组成的数据,长度为max-min+1(数据是固定的,只是顺序随机) 34     function getArr(min,max){ 35       var arr = []; 36       var numToPush = min; 37       for (var i = 0; i < max-min+1; i++) { 38         var len = arr.length; 39         if (len==0) { 40           arr.push(numToPush++); 41         }else{ 42           var randIndex = Math.floor(Math.random()*len); 43           arr.push(numToPush++); 44           //arr中的某一位跟最后一位交换 45           var tmp = arr[randIndex]; 46           arr[randIndex] = arr[len]; 47           arr[len] = tmp; 48         } 49       } 50       return arr; 51     } 52  53     //返回min,max之间的数组成的数据,个数为num(数据随机) 54     function randomArr(min,max,num){ 55       var arr = []; 56       for (var i = 0; i < num; i++) { 57         var randomNumber = Math.floor(Math.random()*(max-min)+min); 58         var inArr = false; 59         for (var i = 0; i < arr.length; i++) { 60           if(arr[i]==randomNumber){ 61             inArr = true; 62             num--; 63             break; 64           } 65         } 66         if (!inArr) { 67           arr.push(randomNumber); 68         } 69       } 70       return arr; 71     } 72      73  74     //获取重复的数据 75     function getDumplicate(){ 76       var num = arguments.length; 77       if (num<2) { return [];}; 78       var obj = { 79         ret:[],      //存储相同的数据 80         container:[]  //存储不同的数据 81       } 82       for (var i = 0; i < 3; i++) { 83         // console.log(arguments[i]); 84         var arr = arguments[i]; 85         obj = deal(arr,obj); 86       } 87       return obj; 88     } 89  90     //处理单个数组,跟容器中的数据比较,并获得重复数据(问题:数据量太大会造成容器中的数据过多) 91     function deal(arr,obj){ 92       var len = obj.container.length; 93       if(len==0) { 94         obj.container = arr; 95       }else{ 96         var arrlen = arr.length; 97         for (var j = 0; j < arrlen; j++) {//遍历数组,每个元素都跟container比较 98          99           var conlen = obj.container.length;100           var intoContainer = false;101           for (var i = 0; i < conlen; i++) {102             var conValue = obj.container[i];103             if(arr[j]==conValue){        //重复的放入ret104               obj.ret.push(arr[j]);105               intoContainer = true;106             }107           }108           if(intoContainer&&!inArr(arr[j],obj.container)){109             obj.container.push(arr[j]);    //不重复的放入容器110           }111         }112       }113       return obj;114     }115     116     //检测数组中是否已经存在这个数据117     function inArr(obj,arr){118       var exist = false;119       var len = arr.length;120       for (var i = 0; i < len; i++) {121         if (arr[i]==obj) {122           exist = true;123         }124       }125       return exist;126     }127 128 129     //-------------------------测试--------------------------------------------130     var date = new Date();131 132     var arr_a = getArr(1,20);133     var arr_b = getArr(18,35);134     var arr_c = getArr(34,50);135     var dumpData= getDumplicate(arr_a,arr_b,arr_c);136     console.log(dumpData.ret);137     //console.log(dumpData.container);138     console.log(useTime(date,new Date()));139 140     console.log("-----------------数据更加随机-----------------------");141 142     var date1 = new Date();143     // console.log(randomArr(1,100,10));144     console.log(getDumplicate(  randomArr(1,1000000,10000),145                   randomArr(1,1000000,10000),146                   randomArr(1,1000000,10000),147                   randomArr(1,1000000,10000),148                   randomArr(1,1000000,10000)149                   ).ret)150     var useTime = useTime(date1,new Date());151     console.log(useTime);152 153   </script>154 </body>155 </html>

 

 

结果:

 

结果:

5个数组5W数据:(数据分布:1W/数组)

 

 

5个数组10W数据:(数据分布:5W,4W,3W,2W,1W)

100个数组100W数据:(数据分布:1W/数组)

结论:

  1.耗时的多少取决于你的算法

  2.总数据不变的情况下:数组个数尽量多,单个数组的数据不能太多.当然不能一概而论

  3.本测试中,单个数组1W数据还行,5W数据不死,10W数据请找华佗

问题:

  1.算法是临时写的(其实没什么算法^_^),有待改进

  2.测试代码中使用了一个数组容器,用于存储不重复的数据.

    那么问题来了:数据量太大会造成容器中的数据过多,然后..你懂的.

  3.测试数据是随机生成的,并且只有数字.如果是其他对象,请另行测试(主要是测试数据不好生成(⊙o⊙)…)

  4.多维数组未测试(测试性能也不一定好0_0)

 

 

  有什么好的意见或建议请与我联系!共勉!共同学习!