javascript
JS求多个数组的重复数据
今天朋友問了我這個問題:JS求多個數(shù)組的重復(fù)數(shù)據(jù)
?注:
1.更準(zhǔn)確的說是只要多個數(shù)組中有兩個以上的重復(fù)數(shù)據(jù),那么這個數(shù)據(jù)就是我需要的
2.單個數(shù)組內(nèi)的數(shù)據(jù)不存在重復(fù)值(當(dāng)然如果有的話,你可以去重)
3.耗時問題,這一點很重要
?
源代碼:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>獲取多個數(shù)組中的重復(fù)數(shù)據(jù)</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() //時間差的毫秒數(shù) 14 15 16 //計算出相差天數(shù) 17 var days=Math.floor(date3/(24*3600*1000)) 18 19 //計算出小時數(shù) 20 21 var leave1=date3%(24*3600*1000) //計算天數(shù)后剩余的毫秒數(shù) 22 var hours=Math.floor(leave1/(3600*1000)) 23 //計算相差分鐘數(shù) 24 var leave2=leave1%(3600*1000) //計算小時數(shù)后剩余的毫秒數(shù) 25 var minutes=Math.floor(leave2/(60*1000)) 26 //計算相差秒數(shù) 27 var leave3=leave2%(60*1000) //計算分鐘數(shù)后剩余的毫秒數(shù) 28 var seconds=Math.round(leave3/1000) 29 return "用時:"+days+" "+hours+":"+minutes+":"+seconds+" "+leave3%1000;//+"''"; 30 } 31 32 33 //返回min,max之間的數(shù)組成的數(shù)據(jù),長度為max-min+1(數(shù)據(jù)是固定的,只是順序隨機(jī)) 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之間的數(shù)組成的數(shù)據(jù),個數(shù)為num(數(shù)據(jù)隨機(jī)) 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 //獲取重復(fù)的數(shù)據(jù) 75 function getDumplicate(){ 76 var num = arguments.length; 77 if (num<2) { return [];}; 78 var obj = { 79 ret:[], //存儲相同的數(shù)據(jù) 80 container:[] //存儲不同的數(shù)據(jù) 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 //處理單個數(shù)組,跟容器中的數(shù)據(jù)比較,并獲得重復(fù)數(shù)據(jù)(問題:數(shù)據(jù)量太大會造成容器中的數(shù)據(jù)過多) 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++) {//遍歷數(shù)組,每個元素都跟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){ //重復(fù)的放入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]); //不重復(fù)的放入容器 110 } 111 } 112 } 113 return obj; 114 } 115 116 //檢測數(shù)組中是否已經(jīng)存在這個數(shù)據(jù) 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("-----------------數(shù)據(jù)更加隨機(jī)-----------------------"); 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>?
?
結(jié)果:
?
?
?
我們測試更多數(shù)據(jù):隨機(jī)產(chǎn)生3個數(shù)組,共計3W條數(shù)據(jù)
結(jié)果:
5個數(shù)組5W數(shù)據(jù):(數(shù)據(jù)分布:1W/數(shù)組)
?
?
5個數(shù)組10W數(shù)據(jù):(數(shù)據(jù)分布:5W,4W,3W,2W,1W)
10個數(shù)組10W數(shù)據(jù):(數(shù)據(jù)分布:1W/數(shù)組)
100個數(shù)組100W數(shù)據(jù):(數(shù)據(jù)分布:1W/數(shù)組)
結(jié)論:
1.耗時的多少取決于你的算法
2.總數(shù)據(jù)不變的情況下:數(shù)組個數(shù)盡量多,單個數(shù)組的數(shù)據(jù)不能太多.當(dāng)然不能一概而論
3.本測試中,單個數(shù)組1W數(shù)據(jù)還行,5W數(shù)據(jù)不死,10W數(shù)據(jù)請找華佗
問題:
1.算法是臨時寫的(其實沒什么算法^_^),有待改進(jìn)
2.測試代碼中使用了一個數(shù)組容器,用于存儲不重復(fù)的數(shù)據(jù).
那么問題來了:數(shù)據(jù)量太大會造成容器中的數(shù)據(jù)過多,然后..你懂的.
3.測試數(shù)據(jù)是隨機(jī)生成的,并且只有數(shù)字.如果是其他對象,請另行測試(主要是測試數(shù)據(jù)不好生成(⊙o⊙)…)
4.多維數(shù)組未測試(測試性能也不一定好0_0)
?
?
有什么好的意見或建議請與我聯(lián)系!共勉!共同學(xué)習(xí)!
?
轉(zhuǎn)載于:https://www.cnblogs.com/PheonixHkbxoic/p/5857674.html
總結(jié)
以上是生活随笔為你收集整理的JS求多个数组的重复数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue computed 使用小问题
- 下一篇: 实战 MDT 2012(六)---基于M