JS求多个数组的重复数据
程序员文章站
2024-03-13 17:00:39
今天朋友问了我这个问题:js求多个数组的重复数据
注:
1.更准确的说是只要多个数组中有两个以上的重复数据,那么这个数据就是我需要的
2.单个数组内的数据...
今天朋友问了我这个问题:js求多个数组的重复数据
注:
1.更准确的说是只要多个数组中有两个以上的重复数据,那么这个数据就是我需要的
2.单个数组内的数据不存在重复值(当然如果有的话,你可以去重)
3.耗时问题,这一点很重要
源代码:
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>获取多个数组中的重复数据</title> </head> <body> <script type="text/javascript"> //计算用时 function usetime(date1,date2){ var date3=date2.gettime()-date1.gettime() //时间差的毫秒数 //计算出相差天数 var days=math.floor(date3/(24*3600*1000)) //计算出小时数 var leave1=date3%(24*3600*1000) //计算天数后剩余的毫秒数 var hours=math.floor(leave1/(3600*1000)) //计算相差分钟数 var leave2=leave1%(3600*1000) //计算小时数后剩余的毫秒数 var minutes=math.floor(leave2/(60*1000)) //计算相差秒数 var leave3=leave2%(60*1000) //计算分钟数后剩余的毫秒数 var seconds=math.round(leave3/1000) return "用时:"+days+" "+hours+":"+minutes+":"+seconds+" "+leave3%1000;//+"''"; } //返回min,max之间的数组成的数据,长度为max-min+1(数据是固定的,只是顺序随机) function getarr(min,max){ var arr = []; var numtopush = min; for (var i = 0; i < max-min+1; i++) { var len = arr.length; if (len==0) { arr.push(numtopush++); }else{ var randindex = math.floor(math.random()*len); arr.push(numtopush++); //arr中的某一位跟最后一位交换 var tmp = arr[randindex]; arr[randindex] = arr[len]; arr[len] = tmp; } } return arr; } //返回min,max之间的数组成的数据,个数为num(数据随机) function randomarr(min,max,num){ var arr = []; for (var i = 0; i < num; i++) { var randomnumber = math.floor(math.random()*(max-min)+min); var inarr = false; for (var i = 0; i < arr.length; i++) { if(arr[i]==randomnumber){ inarr = true; num--; break; } } if (!inarr) { arr.push(randomnumber); } } return arr; } //获取重复的数据 function getdumplicate(){ var num = arguments.length; if (num<2) { return [];}; var obj = { ret:[], //存储相同的数据 container:[] //存储不同的数据 } for (var i = 0; i < 3; i++) { // console.log(arguments[i]); var arr = arguments[i]; obj = deal(arr,obj); } return obj; } //处理单个数组,跟容器中的数据比较,并获得重复数据(问题:数据量太大会造成容器中的数据过多) function deal(arr,obj){ var len = obj.container.length; if(len==0) { obj.container = arr; }else{ var arrlen = arr.length; for (var j = 0; j < arrlen; j++) {//遍历数组,每个元素都跟container比较 var conlen = obj.container.length; var intocontainer = false; for (var i = 0; i < conlen; i++) { var convalue = obj.container[i]; if(arr[j]==convalue){ //重复的放入ret obj.ret.push(arr[j]); intocontainer = true; } } if(intocontainer&&!inarr(arr[j],obj.container)){ obj.container.push(arr[j]); //不重复的放入容器 } } } return obj; } //检测数组中是否已经存在这个数据 function inarr(obj,arr){ var exist = false; var len = arr.length; for (var i = 0; i < len; i++) { if (arr[i]==obj) { exist = true; } } return exist; } //-------------------------测试-------------------------------------------- var date = new date(); var arr_a = getarr(1,20); var arr_b = getarr(18,35); var arr_c = getarr(34,50); var dumpdata= getdumplicate(arr_a,arr_b,arr_c); console.log(dumpdata.ret); //console.log(dumpdata.container); console.log(usetime(date,new date())); console.log("-----------------数据更加随机-----------------------"); var date1 = new date(); // console.log(randomarr(1,100,10)); console.log(getdumplicate( randomarr(1,1000000,10000), randomarr(1,1000000,10000), randomarr(1,1000000,10000), randomarr(1,1000000,10000), randomarr(1,1000000,10000) ).ret) var usetime = usetime(date1,new date()); console.log(usetime); </script> </body> </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)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: PHP获取路径和目录的方法总结【必看篇】
下一篇: PHP获取当前执行php文件名的代码