前言
最近學(xué)習(xí)著呼奢,突然發(fā)現(xiàn)自己心中總有些惶恐戴已,因?yàn)榘l(fā)現(xiàn)自己寫過的一些東西好像忘記了,又好像是以前就沒有弄徹底扳躬,所以決定寫一些代碼夯實(shí)一下基礎(chǔ)脆诉,并打消自己的顧慮,試想一個(gè)始終覺得自己基本功都不扎實(shí)的人贷币,能在程序這條路上走得很遠(yuǎn)击胜?萬丈高樓平地起,所以基礎(chǔ)很重要F瘛G钡摹!這是給我自己的忠告
1字管、最老實(shí)的方法:雙重循環(huán)
這種方法是最基本的去重方法啰挪,思路是循環(huán)數(shù)組的每一個(gè)元素信不,循環(huán)當(dāng)前元素時(shí),會(huì)和數(shù)組當(dāng)前元素后的所有元素進(jìn)行對(duì)比亡呵,找到和它重復(fù)的元素抽活,就說明數(shù)組中有和當(dāng)前正在循環(huán)元素相同的元素(即存在重復(fù)元素),所以就刪除正在循環(huán)的元素锰什,這里有兩種刪除思路
思路一:一次性刪除數(shù)組中和當(dāng)前正在循環(huán)元素相同的所有元素下硕,第二重循環(huán)始終執(zhí)行完
let arr=[1,2,3,4,1,5,5,1,2,'2'];
console.time("test")
function ArrayRemoveRepeat(arr){
for(let i=0,length=arr.length;i<length;i++){
for(let j=i+1,length=arr.length;j<length;j++){
if(arr[i] === arr[j]){
arr.splice(j,1);
j--;
}
}
}
return arr;
}
console.log(ArrayRemoveRepeat(arr)); //[ 1, 2, 3, 4, 5, "2" ]
console.timeEnd("test")
思路二:每次找到數(shù)組中有元素和當(dāng)前正在循環(huán)元素重復(fù)的元素,就刪除當(dāng)前正在循環(huán)的元素汁胆,并使用break跳出循環(huán)
let arr=[1,2,3,4,1,5,5,1,2,'2'];
console.time("test1")
function ArrayRemoveRepeat(arr){
for(let i=0,length=arr.length;i<length;i++){
for(let j=i+1,length=arr.length;j<length;j++){
if(arr[i] === arr[j]){
arr.splice(i,1);
i--;
break;
}
}
}
return arr;
}
console.log(ArrayRemoveRepeat(arr)); //[ 3, 4, 5, 1, 2, "2" ]
console.timeEnd("test1")
下面是這種方法兩種刪除思路的執(zhí)行時(shí)間對(duì)比:
通過對(duì)比我們發(fā)現(xiàn)思路二的循環(huán)效率要快一點(diǎn)點(diǎn)梭姓,這種方法的缺點(diǎn)在于,雙重for循環(huán)嫩码,如果數(shù)組比較長(zhǎng)誉尖,比較耗費(fèi)時(shí)間
2、排序去重法
這種方法的思路就是先把要去重的數(shù)組排序铸题,所有可能重復(fù)的元素都排在了一起铡恕,所以你可以存第一個(gè)元素到無重復(fù)元素的數(shù)組,然后循環(huán)準(zhǔn)備去重的數(shù)組丢间,從數(shù)組索引1開始循環(huán)探熔,因?yàn)樗饕?的元素已經(jīng)存到了無重復(fù)元素的數(shù)組里面,你只要比較當(dāng)前正在循環(huán)的元素和無重復(fù)元素?cái)?shù)組的最后一位元素是否相同烘挫,如果相同诀艰,就繼續(xù)下一次循環(huán),如果不相同饮六,就把當(dāng)前正在循環(huán)的元素加到無重復(fù)元素的數(shù)組
let arr1=[1,2,3,4,1,5,5,1,2,'2'];
function ArrayRemoveRepeat1(arr){
arr.sort();
let arrCompare=[arr[0]];
for(let i=1,length=arr.length;i<length;i++){
if(arr[i]!==arrCompare[arrCompare.length-1]){
arrCompare.push(arr[i]);
}
}
return arrCompare;
}
console.log(ArrayRemoveRepeat1(arr1)) //[ 1, 2, "2", 3, 4, 5 ]
這種去重方式思路比較發(fā)散涡驮,但是缺點(diǎn)也比較明顯,就是要先將待去重的數(shù)組排序喜滨,如果你本意只是想當(dāng)初的去重,并不想排序撤防,可能這種方式就不太適合
3虽风、對(duì)象去重法
這種去重方法的思路是拿一個(gè)對(duì)象的減去存數(shù)組的元素,利用對(duì)象鍵的唯一性寄月,如果對(duì)象的鍵對(duì)應(yīng)的鍵值不存在辜膝,則該元素不是重復(fù)元素,將該元素添加到無重復(fù)元素?cái)?shù)組漾肮,并將該元素作為對(duì)象的鍵存儲(chǔ)厂抖,該元素作為鍵對(duì)應(yīng)的鍵值為true,表示該元素已經(jīng)添加到無重復(fù)元素?cái)?shù)組中了
let arr2=[1,2,3,4,1,5,5,1,2,'2'];
function ArrayRemoveRepeat2(arr){
let obj={};
let res=[];
for(let i=0,length=arr.length;i<length;i++){
if(!obj[arr[i]]){
res.push(arr[i]);
obj[arr[i]]=true;
}
}
return res;
}
console.log(ArrayRemoveRepeat2(arr2));//[ 1, 2, 3, 4, 5 ]
這種方式克懊,只進(jìn)行了一次循環(huán)忱辅,效率比較高七蜘,但是它也有它的問題,細(xì)心的同學(xué)可能已經(jīng)發(fā)現(xiàn)了墙懂,數(shù)組元素字符串的2也被去掉了橡卤,只是為什么?熟悉對(duì)象的都知道损搬,標(biāo)準(zhǔn)對(duì)象的鍵都是字符串碧库,所以字符串2和數(shù)字2作為對(duì)象的鍵被認(rèn)為是相等的,所以導(dǎo)致字符串2也被去除了
4巧勤、利用ES6的數(shù)據(jù)結(jié)構(gòu)set去重
這種去重方式的思路是利用set數(shù)據(jù)結(jié)構(gòu)能夠自動(dòng)去除重復(fù)元素
let arr3=[1,2,3,4,1,5,5,1,2,'2'];
function ArrayRemoveRepeat3(arr){
let set=new Set(arr); //將數(shù)組作為參數(shù)傳入set結(jié)果嵌灰,進(jìn)行去重
arr=Array.from(set); //利用Array.from將set結(jié)構(gòu)轉(zhuǎn)換成數(shù)組
return arr;
}
console.log(ArrayRemoveRepeat3(arr3)); //[ 1, 2, 3, 4, 5, "2" ]
5、利用數(shù)組的indexOf方法去重
這種去重方法的思路是循環(huán)數(shù)組的每一個(gè)元素颅悉,然后用正在循環(huán)的元素去無重復(fù)元素的數(shù)組里面進(jìn)行查找沽瞭,看無重復(fù)元素的數(shù)組里面是否有這個(gè)元素,如果沒有這個(gè)元素签舞,則加該元素添加到無重復(fù)元素的數(shù)組中秕脓,這方法類似于字符串的indexOf方法
let arr4=[1,2,3,4,1,5,5,1,2,'2'];
function ArrayRemoveRepeat4(arr){
let res=[];
for(let i=0,length=arr.length;i<length;i++){
if(res.indexOf(arr[i])===-1){
res.push(arr[i]);
}
}
return res;
}
console.log(ArrayRemoveRepeat4(arr4))//[ 1, 2, 3, 4, 5, "2" ]
6、利用高階函數(shù)filter方法
let arr5=[1,2,3,4,1,5,5,1,2,'2'];
const arr=arr5.filter(function(ele,index,array){
return index===array.indexOf(ele)
})
console.log(arr) //[ 1, 2, 3, 4, 5, "2" ]
元素索引和元素第一次出現(xiàn)在數(shù)組中的索引一致儒搭,則表明元素是第一次出現(xiàn)吠架,就把該元素過濾出來放到去重之后的數(shù)組里面
7、我有話說
可能我們用第一種方法比較多搂鲫,因?yàn)樗彩亲钊菀紫氲降姆椒ò俏覀儜?yīng)該去嘗試和總結(jié)更多的方法,學(xué)習(xí)也是一樣魂仍,在這里告誡自己:多嘗試拐辽,多思考,多總結(jié)