国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

JS求多個數組的重復數據

2019-11-26 13:50:56
字體:
來源:轉載
供稿:網友

今天朋友問了我這個問題: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)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 门头沟区| 瑞安市| 望谟县| 连江县| 纳雍县| 义马市| 西乌| 岱山县| 星子县| 临高县| 河西区| 东台市| 凤庆县| 英超| 高密市| 凤冈县| 铁岭市| 阿拉善盟| 宜兰市| 西和县| 元江| 固始县| 内江市| 天峻县| 柳河县| 昭平县| 额敏县| 赫章县| 同仁县| 缙云县| 浙江省| 志丹县| 水富县| 建平县| 景东| 越西县| 秦皇岛市| 湟中县| 山东| 邵阳市| 罗田县|