JS求多個(gè)數(shù)組的重復(fù)數(shù)據(jù)
今天朋友問(wèn)了我這個(gè)問(wèn)題:JS求多個(gè)數(shù)組的重復(fù)數(shù)據(jù)
注:
1.更準(zhǔn)確的說(shuō)是只要多個(gè)數(shù)組中有兩個(gè)以上的重復(fù)數(shù)據(jù),那么這個(gè)數(shù)據(jù)就是我需要的
2.單個(gè)數(shù)組內(nèi)的數(shù)據(jù)不存在重復(fù)值(當(dāng)然如果有的話,你可以去重)
3.耗時(shí)問(wèn)題,這一點(diǎn)很重要
源代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>獲取多個(gè)數(shù)組中的重復(fù)數(shù)據(jù)</title>
</head>
<body>
<script type="text/javascript">
//計(jì)算用時(shí)
function useTime(date1,date2){
var date3=date2.getTime()-date1.getTime() //時(shí)間差的毫秒數(shù)
//計(jì)算出相差天數(shù)
var days=Math.floor(date3/(24*3600*1000))
//計(jì)算出小時(shí)數(shù)
var leave1=date3%(24*3600*1000) //計(jì)算天數(shù)后剩余的毫秒數(shù)
var hours=Math.floor(leave1/(3600*1000))
//計(jì)算相差分鐘數(shù)
var leave2=leave1%(3600*1000) //計(jì)算小時(shí)數(shù)后剩余的毫秒數(shù)
var minutes=Math.floor(leave2/(60*1000))
//計(jì)算相差秒數(shù)
var leave3=leave2%(60*1000) //計(jì)算分鐘數(shù)后剩余的毫秒數(shù)
var seconds=Math.round(leave3/1000)
return "用時(shí):"+days+" "+hours+":"+minutes+":"+seconds+" "+leave3%1000;//+"''";
}
//返回min,max之間的數(shù)組成的數(shù)據(jù),長(zhǎng)度為max-min+1(數(shù)據(jù)是固定的,只是順序隨機(jī))
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之間的數(shù)組成的數(shù)據(jù),個(gè)數(shù)為num(數(shù)據(jù)隨機(jī))
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;
}
//獲取重復(fù)的數(shù)據(jù)
function getDumplicate(){
var num = arguments.length;
if (num<2) { return [];};
var obj = {
ret:[], //存儲(chǔ)相同的數(shù)據(jù)
container:[] //存儲(chǔ)不同的數(shù)據(jù)
}
for (var i = 0; i < 3; i++) {
// console.log(arguments[i]);
var arr = arguments[i];
obj = deal(arr,obj);
}
return obj;
}
//處理單個(gè)數(shù)組,跟容器中的數(shù)據(jù)比較,并獲得重復(fù)數(shù)據(jù)(問(wèn)題:數(shù)據(jù)量太大會(huì)造成容器中的數(shù)據(jù)過(guò)多)
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++) {//遍歷數(shù)組,每個(gè)元素都跟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){ //重復(fù)的放入ret
obj.ret.push(arr[j]);
intoContainer = true;
}
}
if(intoContainer&&!inArr(arr[j],obj.container)){
obj.container.push(arr[j]); //不重復(fù)的放入容器
}
}
}
return obj;
}
//檢測(cè)數(shù)組中是否已經(jīng)存在這個(gè)數(shù)據(jù)
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;
}
//-------------------------測(cè)試--------------------------------------------
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("-----------------數(shù)據(jù)更加隨機(jī)-----------------------");
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>
結(jié)果:

我們測(cè)試更多數(shù)據(jù):隨機(jī)產(chǎn)生3個(gè)數(shù)組,共計(jì)3W條數(shù)據(jù)
結(jié)果:

5個(gè)數(shù)組5W數(shù)據(jù):(數(shù)據(jù)分布:1W/數(shù)組)

5個(gè)數(shù)組10W數(shù)據(jù):(數(shù)據(jù)分布:5W,4W,3W,2W,1W)

10個(gè)數(shù)組10W數(shù)據(jù):(數(shù)據(jù)分布:1W/數(shù)組)

100個(gè)數(shù)組100W數(shù)據(jù):(數(shù)據(jù)分布:1W/數(shù)組)

結(jié)論:
1.耗時(shí)的多少取決于你的算法
2.總數(shù)據(jù)不變的情況下:數(shù)組個(gè)數(shù)盡量多,單個(gè)數(shù)組的數(shù)據(jù)不能太多.當(dāng)然不能一概而論
3.本測(cè)試中,單個(gè)數(shù)組1W數(shù)據(jù)還行,5W數(shù)據(jù)不死,10W數(shù)據(jù)請(qǐng)找華佗
問(wèn)題:
1.算法是臨時(shí)寫的(其實(shí)沒(méi)什么算法^_^),有待改進(jìn)
2.測(cè)試代碼中使用了一個(gè)數(shù)組容器,用于存儲(chǔ)不重復(fù)的數(shù)據(jù).
那么問(wèn)題來(lái)了:數(shù)據(jù)量太大會(huì)造成容器中的數(shù)據(jù)過(guò)多,然后..你懂的.
3.測(cè)試數(shù)據(jù)是隨機(jī)生成的,并且只有數(shù)字.如果是其他對(duì)象,請(qǐng)另行測(cè)試(主要是測(cè)試數(shù)據(jù)不好生成(⊙o⊙)…)
4.多維數(shù)組未測(cè)試(測(cè)試性能也不一定好0_0)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 分享JS數(shù)組求和與求最大值的方法
- JavaScript學(xué)習(xí)筆記之?dāng)?shù)組求和方法
- Javascript計(jì)算二維數(shù)組重復(fù)值示例代碼
- 計(jì)算100000數(shù)組js腳本的執(zhí)行時(shí)間
- 求js數(shù)組的最大值和最小值的四種方法
- javascript中數(shù)組中求最大值示例代碼
- JavaScript求一個(gè)數(shù)組中重復(fù)出現(xiàn)次數(shù)最多的元素及其下標(biāo)位置示例
- JS求Number類型數(shù)組中最大元素方法
- js求數(shù)組中全部數(shù)字可拼接出的最大整數(shù)示例代碼
- JS實(shí)現(xiàn)求數(shù)組起始項(xiàng)到終止項(xiàng)之和的方法【基于數(shù)組擴(kuò)展函數(shù)】
- JavaScript實(shí)現(xiàn)數(shù)組全排列、去重及求最大值算法示例
- JS數(shù)組求和的常用方法實(shí)例小結(jié)
相關(guān)文章
SpringBoot整合FreeMarker的過(guò)程詳解
FreeMarker 是一個(gè)模板引擎,可以將模板與數(shù)據(jù)結(jié)合生成文本輸出,本文給大家介紹SpringBoot整合FreeMarker的過(guò)程,感興趣的朋友一起看看吧2024-01-01
Java遞歸調(diào)用如何實(shí)現(xiàn)數(shù)字的逆序輸出方式
這篇文章主要介紹了Java遞歸調(diào)用如何實(shí)現(xiàn)數(shù)字的逆序輸出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Java 本地方法Native Method詳細(xì)介紹
這篇文章主要介紹了 Java 本地方法Native Method詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2017-02-02
Java原生服務(wù)器接收上傳文件 不使用MultipartFile類
這篇文章主要為大家詳細(xì)介紹了Java原生服務(wù)器接收上傳文件,不使用MultipartFile類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
詳解eclipse將項(xiàng)目打包成jar文件的兩種方法及問(wèn)題解決方法
本文給大家介紹了eclipse中將項(xiàng)目打包成jar文件的兩種方法及其遇到問(wèn)題解決方法,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-12-12
JavaFX 監(jiān)聽(tīng)窗口關(guān)閉事件實(shí)例詳解
這篇文章主要介紹了JavaFX 監(jiān)聽(tīng)窗口關(guān)閉事件實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05
淺析Java?NIO?直接緩沖區(qū)和非直接緩沖區(qū)
本篇文章主要為大家介紹了Java?NIO?中直接緩沖區(qū)和非直接緩沖區(qū)的定義以及使用流程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11
java Spring MVC4環(huán)境搭建實(shí)例詳解(步驟)
spring WEB MVC框架提供了一個(gè)MVC(model-view-controller)模型-視圖-控制器的結(jié)構(gòu)和組件,利用它可以開(kāi)發(fā)更靈活、松耦合的web應(yīng)用。MVC模式使得整個(gè)服務(wù)應(yīng)用的各部分(控制邏輯、業(yè)務(wù)邏輯、UI界面展示)分離開(kāi)來(lái),使它們之間的耦合性更低2017-08-08

