zoukankan      html  css  js  c++  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){                //重复的放入ret
    104                             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>

    结果:

    我们测试更多数据:随机产生3个数组,共计3W条数据

    结果:

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

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

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

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

    结论:

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

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

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

    问题:

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

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

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

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

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

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

  • 相关阅读:
    DDT驱动selenium自动化测试
    python 对Excel表格的读取
    python 对Excel表格的写入
    selenium对百度进行登录注销
    selenium的八大定位元素的方式
    selenium打开Chrome浏览器并最大化
    行列式计算的归纳
    C标准库函数getchar()
    测试必备-抓包工具的使用
    uiautomator2使用教程
  • 原文地址:https://www.cnblogs.com/PheonixHkbxoic/p/5857674.html
Copyright © 2011-2022 走看看