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)

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

时间: 2024-10-13 21:57:41

JS求多个数组的重复数据的相关文章

关于iOS去除数组中重复数据的几种方法

关于iOS去除数组中重复数据的几种方法 在工作工程中我们不必要会遇到,在数组中有重复数据的时候,如何去除重复的数据呢? 第一种:利用NSDictionary的AllKeys(AllValues)方法 可以将NSArray中的元素存入一个字典,然后利用AllKeys或者AllValues取得字典的所有键或值,这些键或值都是去重的.代码: NSArray *dataArray = @[@"2014-04-01",@"2014-04-02",@"2014-04-

C# 移除数组中重复数据

#region 移除数组中重复数据 /// <summary> /// 移除数组中重复数据 /// </summary> /// <param name="array">需要除重的数组</param> /// <returns>不重复数组</returns> public static string[] DelRepeatData(string[] array) { return array.GroupBy(p =

移除数组中重复数据

#region 移除数组中重复数据 /// <summary> /// 移除数组中重复数据 /// </summary> /// <param name="array">需要除重的数组</param> /// <returns>不重复数组</returns> public static string[] DelRepeatData(string[] array) { return array.GroupBy(p =

php去除数组中重复数据

<?php /** * 去除数组中重复数据 * by www.jbxue.com **/ $input = array("a" => "green","", "red","b" => "green", "","blue", "red","c" => "witer",

JAVA数组去除重复数据

一.用List集合实现   int[] str = {5, 6, 6, 6, 8, 8, 7,4}; List<Integer> list = new ArrayList<Integer>(); for (int i=0; i<str.length; i++) { if(!list.contains(str[i])) { list.add(str[i]); } } System.out.println("去除重复后的list集合"+list); 输出结果是

Java实现数组去除重复数据的方法详解

一.用List集合实现 int[] str = {5, 6, 6, 6, 8, 8, 7,4}; List<Integer> list = new ArrayList<Integer>(); for (int i=0; i<str.length; i++) { if(!list.contains(str[i])) { list.add(str[i]); } } System.out.println("去除重复后的list集合"+list); 输出结果是:

PHP去除数组中重复数据的两个例子

例一: <?php$input = array("a" => "green","", "red","b" => "green", "","blue", "red","c" => "witer","hello","witer")

String-需求:把数组中的数据按照指定的格式拼接成一个字符串

package cn.lianxi; /* * 需求:把数组中的数据按照指定的格式拼接成一个字符串 * 举例: * int [] arr = {1,2,3}; * 输出结果 * “[1, 2, 3]” * 分析: * 1.定义一个字符串对象,只不过内容为空 * 2.把字符串拼接一个“[” * 3.遍历数组,得到每一个元素 * 4.先判断该元素是否为最后一个 * 是:就直接拼接元素和] * 不是:就拼接元素和逗号以及空格 * 5.输出拼接后的字符串 * */ public class zifu {

js判断数组是否有重复数据的三种方法

var arr=new Array("aa","bb","cc","dd","aaa","aa"); // 方法1:取出数组中的一个值,与其之后的数据挨个比对>>>最容易想到,但运算最麻烦 var method1=function(array){ for(var i=0;i<array.length-1;i++) { for(var j=i+1;j<arra