如何消除一個數(shù)組里面重復(fù)的元素穆趴?

在日常開發(fā)中脸爱,我們可能會遇到去重問題,這篇文章就是為了解決這個問題而寫的未妹。

為了方便使用寇蚊,我們可以直接把封裝的去重函數(shù)直接加入到數(shù)組的prototype中。

方法一:

Array.prototype.clearRepeat = function()?{

var arr =?[];?//定義一個臨時(shí)數(shù)組

for(var i = 0; i < this.length; i++)?{

//通過遍歷判斷當(dāng)前數(shù)組下標(biāo)為i的元素是否保存到臨時(shí)數(shù)組中

//如果保存过蹂,則跳過茬腿,否則保存到臨時(shí)數(shù)組

if(arr.indexOf(this[i])?==?-1)?{

arr.push(this[i]);

}

}

return arr;

};

var test =?[1, 6, 8, 8, 9, 9, 9,?"a",?"a"];

test.clearRepeat();????//結(jié)果為[1, 6, 8, 9,?"a"]

方法二:

Array.prototype.clearRepeat = function()?{

var arr =?[this[0]];?//直接定義結(jié)果數(shù)組

for(var i = 1; i < this.length; i++)?{?//從第二項(xiàng)開始遍歷當(dāng)前數(shù)組

//對元素進(jìn)行判斷:

//如果當(dāng)前數(shù)組元素在此數(shù)組中第一次出現(xiàn)的位置不是i

//則第i項(xiàng)是重復(fù)的,否則直接存入結(jié)果數(shù)組

if(this.indexOf(this[i])?== i)?{

arr.push(this[i]);

}

}

return arr;

};

var test =?[1, 6, 8, 8, 9, 9, 9,?"a",?"a"];

test.clearRepeat();????//結(jié)果為[1, 6, 8, 9,?"a"]

上面兩種方法不推薦使用化戳,因?yàn)閕ndexOf()這個函數(shù)在執(zhí)行的時(shí)候每次都會遍歷一次數(shù)組单料,對性能影響比較大。比較適合小數(shù)據(jù)量的數(shù)組点楼。

方法三:

Array.prototype.clearRepeat = function()?{

var h =?{};?//定義一個hash表

var arr =?[];?//定義一個臨時(shí)數(shù)組

for(var i = 0; i < this.length; i++)?{

//對元素進(jìn)行判斷是否存在表中扫尖,如存在則跳過,否則存入臨時(shí)數(shù)組

if(!h[this[i]])?{

h[this[i]]?= true;?//存入hash表

arr.push(this[i]);

}

}

return arr;

};

var test =?[1, 6, 8, 8, 9, 9, 9,?"a",?"a"];

test.clearRepeat();????//結(jié)果為[1, 6, 8, 9,?"a"]

上面這種方法使用的是hash表掠廓,把已經(jīng)出現(xiàn)過的元素通過下標(biāo)形式寫入一個Object中换怖,下標(biāo)的引用要比數(shù)組的indexOf()方法搜索節(jié)省時(shí)間。

順便補(bǔ)充下hash表的知識:

哈希表也叫散列表蟀瞧,是根據(jù)關(guān)鍵碼值(key, value)而進(jìn)行訪問的數(shù)據(jù)結(jié)構(gòu)沉颂。它通過把關(guān)鍵碼值映射到表中一個位置來訪問記錄条摸,以加快查找速度。這個映射函數(shù)叫做散列函數(shù)铸屉,存放記錄的數(shù)組叫做散列表钉蒲。

關(guān)于hash表的詳細(xì)知識請點(diǎn)擊這里

通過測試發(fā)現(xiàn)上面這種方法存在一種缺陷,那就是當(dāng)數(shù)組中同時(shí)出現(xiàn)類似于1和“1”這樣的元素時(shí)彻坛,會把“1”這樣的元素被去重子巾。

var test?=?[1,?6,?8,?8,?9,?9,?9,?"a",?"a",?"1"];

test.clearRepeat();????//結(jié)果為[1, 6, 8, 9,?"a"],正確的應(yīng)該為[1, 6, 8, 9,?"a"小压,"1"]

查閱資料發(fā)現(xiàn)原因是因?yàn)椋?/p>

作為下標(biāo)在轉(zhuǎn)換后會變成字符串线梗,那么對于1和“1”這樣不同類型的值會對應(yīng)到同一個下標(biāo)而被去重。

修改后的代碼:

Array.prototype.clearRepeat = function()?{

var h =?{};?//定義一個hash表

var arr =?[];?//定義一個臨時(shí)數(shù)組

for(var i = 0; i < this.length; i++)?{

//對元素進(jìn)行判斷是否存在表中怠益,如存在則跳過仪搔,否則存入臨時(shí)數(shù)組

var type = typeof this[i];

if(!h[this[i]?+ type])?{

h[this[i]?+ type]?= true;

arr.push(this[i]);

}

}

return arr;

};

var test =?[1, 6, 8, 8, 9, 9, 9,?"a",?"a",?"1"];

test.clearRepeat();????//結(jié)果為[1, 6, 8, 9,?"a",?"1"]

方法四:

Array.prototype.clearRepeat = function()?{

this.sort();?//數(shù)組排序

var arr =?[this[0]];?//定義結(jié)果數(shù)組

for(var i = 1; i < this.length; i++)?{?//從第二項(xiàng)開始遍歷當(dāng)前數(shù)組

//判斷兩個相鄰元素是否相等,如果相等說明數(shù)據(jù)重復(fù)蜻牢,否則將元素寫入結(jié)果數(shù)組

if(this[i]?!== arr[arr.length - 1])?{

arr.push(this[i]);

}

}

return arr;

};

var test =?[1, 6, 8, 8, 9, 9, 9,?"a",?"a"];

test.clearRepeat();????//結(jié)果為[1, 6, 8, 9,?"a"]

上面這種方法先將數(shù)組排序烤咧,然后比較相鄰兩個元素是否相等,若相等說明重復(fù)抢呆。數(shù)組排序采用的原生sort()煮嫌。

關(guān)于數(shù)組排序方法請點(diǎn)擊這里

上面四種方法的優(yōu)劣和性能讀者可以自行去測試。

如果你在本文中發(fā)現(xiàn)錯誤或者有異議的地方抱虐,可以在評論區(qū)留言昌阿,謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恳邀,一起剝皮案震驚了整個濱河市懦冰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谣沸,老刑警劉巖刷钢,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乳附,居然都是意外死亡内地,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門赋除,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阱缓,“玉大人,你說我怎么就攤上這事贤重〔绲唬” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵并蝗,是天一觀的道長祭犯。 經(jīng)常有香客問我,道長滚停,這世上最難降的妖魔是什么沃粗? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮键畴,結(jié)果婚禮上最盅,老公的妹妹穿的比我還像新娘。我一直安慰自己起惕,他們只是感情好涡贱,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惹想,像睡著了一般问词。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘀粱,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天激挪,我揣著相機(jī)與錄音,去河邊找鬼锋叨。 笑死垄分,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的娃磺。 我是一名探鬼主播薄湿,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼偷卧!你這毒婦竟也來了嘿般?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤涯冠,失蹤者是張志新(化名)和其女友劉穎炉奴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛇更,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瞻赶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了派任。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砸逊。...
    茶點(diǎn)故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掌逛,靈堂內(nèi)的尸體忽然破棺而出师逸,到底是詐尸還是另有隱情,我是刑警寧澤豆混,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布篓像,位于F島的核電站动知,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏员辩。R本人自食惡果不足惜盒粮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奠滑。 院中可真熱鬧丹皱,春花似錦、人聲如沸宋税。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杰赛。三九已至呢簸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間淆攻,已是汗流浹背阔墩。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓶珊,地道東北人啸箫。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像伞芹,于是被迫代替她去往敵國和親忘苛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評論 2 361

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