javascript 中關(guān)于數(shù)組去重的6種方法

前言

最近學(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é)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末擦酌,一起剝皮案震驚了整個(gè)濱河市俱诸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赊舶,老刑警劉巖睁搭,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異笼平,居然都是意外死亡园骆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門寓调,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锌唾,“玉大人,你說我怎么就攤上這事夺英∩翁椋” “怎么了滋捶?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)渐排。 經(jīng)常有香客問我炬太,道長(zhǎng),這世上最難降的妖魔是什么驯耻? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任亲族,我火速辦了婚禮,結(jié)果婚禮上可缚,老公的妹妹穿的比我還像新娘霎迫。我一直安慰自己,他們只是感情好帘靡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布知给。 她就那樣靜靜地躺著,像睡著了一般描姚。 火紅的嫁衣襯著肌膚如雪涩赢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天轩勘,我揣著相機(jī)與錄音筒扒,去河邊找鬼。 笑死绊寻,一個(gè)胖子當(dāng)著我的面吹牛花墩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播澄步,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼冰蘑,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了村缸?” 一聲冷哼從身側(cè)響起祠肥,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梯皿,沒想到半個(gè)月后搪柑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡索烹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弱睦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片百姓。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖况木,靈堂內(nèi)的尸體忽然破棺而出垒拢,到底是詐尸還是另有隱情旬迹,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布求类,位于F島的核電站奔垦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尸疆。R本人自食惡果不足惜椿猎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寿弱。 院中可真熱鬧犯眠,春花似錦、人聲如沸症革。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽噪矛。三九已至量蕊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間艇挨,已是汗流浹背残炮。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雷袋,地道東北人吉殃。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像楷怒,于是被迫代替她去往敵國(guó)和親蛋勺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法鸠删,類相關(guān)的語法抱完,內(nèi)部類的語法,繼承相關(guān)的語法刃泡,異常的語法巧娱,線程的語...
    子非魚_t_閱讀 31,602評(píng)論 18 399
  • 回到家頭要疼炸了,換了睡衣在床上躺了半小時(shí)烘贴,緩過來神禁添,爬起來煮面。昨晚翻遍了屋子和冰箱都沒有可以做早餐的東西桨踪,七點(diǎn)...
    Lebkuchen閱讀 204評(píng)論 0 1
  • Better late than never. A decade ago, she wrote the four ...
    Paula_Fan閱讀 479評(píng)論 2 3
  • XSS跨站腳本攻擊算是web安全中比較流行的一種攻擊方法老翘,分享一些我學(xué)習(xí)xss的文章,對(duì)于新手在漏洞挖掘方面很有幫...
    Dale丶閱讀 632評(píng)論 0 2
  • 成果都整理到了 https://github.com/ws-php/openstf-custom 在設(shè)備列表加了2...
    許一沐閱讀 1,033評(píng)論 1 1