數(shù)組和算法-數(shù)組去重

<h1>數(shù)組去重</h1>

<blockquote>
<p>之前一段時(shí)間一直在準(zhǔn)備面試, 因而博客太久沒(méi)更新兢仰; 現(xiàn)在基本知識(shí)點(diǎn)都復(fù)習(xí)完畢变丧, 接下來(lái)就分享下 面試的一些常見(jiàn)問(wèn)題:

去正規(guī)的互聯(lián)網(wǎng)公司筆試、面試有很大的概率會(huì)碰到 使用javascript實(shí)現(xiàn)數(shù)組去重的編碼問(wèn)題:下面筆者就介紹幾種數(shù)組去重的方法</p>
</blockquote>

<h2>利用對(duì)象的鍵值對(duì)方法去重</h2>

<p>思路:</p>

<ol>
<li>我們把數(shù)組中的每一項(xiàng)的值當(dāng)做一個(gè)對(duì)象的屬性名和屬性值存儲(chǔ)起來(lái)</li>
<li>但是我們?cè)诖鎯?chǔ)之前鲤妥,我們首先判斷當(dāng)前這一項(xiàng)(N)是否在對(duì)象中已經(jīng)存在了->obj[N],如果值是N(我們已經(jīng)把值和屬性名存儲(chǔ)成是一樣的),說(shuō)明對(duì)象中已經(jīng)存在這一項(xiàng)了拱雏,如果值是undefined,說(shuō)明對(duì)象中還沒(méi)有這一項(xiàng)</li>
<li>如果值是N棉安,說(shuō)明對(duì)象中已經(jīng)存在這一項(xiàng),同時(shí)也說(shuō)明在N之前數(shù)組中已經(jīng)出現(xiàn)過(guò)一次N了铸抑,即這一項(xiàng)已經(jīng)重復(fù)贡耽,我們從數(shù)組中把這一項(xiàng)刪掉,如果值是undefined,說(shuō)明對(duì)象中還沒(méi)有這一項(xiàng),也說(shuō)明這一項(xiàng)以前沒(méi)有在數(shù)組中出現(xiàn)過(guò)蒲赂,我們把當(dāng)前值存儲(chǔ)進(jìn)去即可</li>
</ol>

<p>```</p>

<p>比如:</p>

<p>var obj = {};
obj[1] -> undefined {1:1}
obj[2] -> undefined {2:2}
obj[3] -> undefined {3:3}
obj[2] -> 2 {1:1}
obj[1] -> 說(shuō)明第四項(xiàng)2在之前出現(xiàn)過(guò)阱冶,我們把第四項(xiàng)刪除</p>

<p>```
思路我們就分析完了,現(xiàn)在具體寫(xiě)這個(gè)方法</p>

<p>```
var ary = [1,2,3,2,3,2,3,1,2,3,4,2,3,1];
var obj = {};
for(var i=0;i<ary.length;i++){
var cur = ary[i];//此處是遍歷數(shù)組 ary[1]=1,2,3,2......同是
把這個(gè)值賦值給cur即cur=1,2,3,2...此時(shí)我們就能讓屬性名和屬性值相
同滥嘴。var 1= 1;var 2 = 2 ...;
if(obj[cur]==cur){//我們把屬性名和屬性值木蹬,存儲(chǔ)到對(duì)象中,即
obj[1]和1,如果對(duì)象中obj[1]的值和你存儲(chǔ)cur的值相同若皱,則滿足此條
件届囚,但是我們存儲(chǔ)第一項(xiàng)的時(shí)候?qū)ο笾衞bj[1]還沒(méi)有值,即undefined,所以
第一項(xiàng)不滿足是尖。如果滿足,我們就刪除數(shù)組中的這一項(xiàng)
ary.splice(i,1);//即把第i項(xiàng)刪除->splice方法泥耀,從第i項(xiàng)刪除一
個(gè)饺汹,注意,刪除后痰催,會(huì)有數(shù)組塌陷兜辞,所以我們要i--
i--;</p>

<pre><code> }else {//不滿足if條件,走此步夸溶。
obj[cur] = cur;//把數(shù)組里的值逸吵,存儲(chǔ)到對(duì)象中。以便用此條件給后面
的條件進(jìn)行判斷
}
}
console.log(ary);
</code></pre>

<p>```</p>

<p>結(jié)果為 [1, 2, 3, 4]</p>

<p>這是一種方法缝裁,但是這種方法并不完美扫皱,因?yàn)橛袛?shù)組塌陷問(wèn)題,對(duì)系統(tǒng)性能有一定影響</p>

<p>下面這是升級(jí)改進(jìn)的方法捷绑。

在上面的思路上,我們可以不用splice方法韩脑,如果對(duì)象中屬性名和屬性值一樣,我們可以把比較的當(dāng)前項(xiàng)粹污,用最后面的一項(xiàng)替換掉段多,然后把最后一項(xiàng)刪除即可,注意:仍要用i--;因?yàn)槟眠^(guò)來(lái)壮吩,還沒(méi)有比較进苍,還要再次走一遍if條件對(duì)新值進(jìn)行比較。</p>

<p>```
var ary = [1,2,3,2,3,2,3,1,2,3,4,2,3,1];
var obj = {};
for(var i=0;i<ary.length;i++){
var cur = ary[i];
if(obj[cur]==cur){
ary[i] = ary[ary.length-1];//我們把最后一項(xiàng)鸭叙,替換掉當(dāng)前項(xiàng)
ary.length--;//刪除掉最后一項(xiàng)觉啊,即把數(shù)組長(zhǎng)度縮小一位即可。
i--;</p>

<pre><code> }else {//不滿足if條件递雀,走此步柄延。
obj[cur] = cur;//把數(shù)組里的值,存儲(chǔ)到對(duì)象中。以便用此條件給后面的條件進(jìn)行判斷
}
}
console.log(ary);
</code></pre>

<p>```
結(jié)果為 [1, 2, 3, 4]</p>

<p>以上方法是在原數(shù)組中操作搜吧,其實(shí)我感覺(jué)并不是最好的方法市俊,假如在數(shù)組中有不同類型的相同值得項(xiàng)呢?我們可以另定義一個(gè)新數(shù)組滤奈,然后在加上類型的判斷摆昧,這種方法就不很細(xì)的解讀了。寫(xiě)上以便讀者參考</p>

<p><code>var ary = [3,2,3,1,4,true,false,"3","22","2",2];
function noRepeat(ary) {
var newAry = [];
var obj = {};
for(var i=0;i<ary.length;i++){
if(!(obj[ary[i]+typeof ary[i]])){//此處將obj的屬性值用值+類型的方式存儲(chǔ)起來(lái)蜒程,比如第一項(xiàng)obj[3number];如果該屬性名的值不存在绅你,則在此處執(zhí)行
newAry.push(ary[i]);
obj[ary[i]+typeof ary[i]] = 1;//此處把該對(duì)象的屬性名的值隨便賦值成一個(gè)東東,比如1昭躺,以后判斷的時(shí)候忌锯,證明該屬性名的值存在
}
}
return newAry;// 此函數(shù)的最終目的是返回新的數(shù)組。
}
var res = noRepeat(ary);//執(zhí)行此函數(shù)领炫,并賦值給res,即res = newAry;
console.log(res);</code></p>

<p>結(jié)果為 [3, 2, 1, 4, true, false, "3", "22", "2"]</p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末偶垮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子帝洪,更是在濱河造成了極大的恐慌似舵,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葱峡,死亡現(xiàn)場(chǎng)離奇詭異砚哗,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)砰奕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門蛛芥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人脆淹,你說(shuō)我怎么就攤上這事倡缠∫寥海” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)氨距。 經(jīng)常有香客問(wèn)我揭糕,道長(zhǎng)赚导,這世上最難降的妖魔是什么尚粘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蝇庭,結(jié)果婚禮上醉鳖,老公的妹妹穿的比我還像新娘。我一直安慰自己哮内,他們只是感情好盗棵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布壮韭。 她就那樣靜靜地躺著,像睡著了一般纹因。 火紅的嫁衣襯著肌膚如雪喷屋。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天瞭恰,我揣著相機(jī)與錄音屯曹,去河邊找鬼。 笑死惊畏,一個(gè)胖子當(dāng)著我的面吹牛恶耽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播颜启,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼偷俭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了缰盏?” 一聲冷哼從身側(cè)響起社搅,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乳规,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體合呐,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡暮的,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淌实。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冻辩。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拆祈,靈堂內(nèi)的尸體忽然破棺而出恨闪,到底是詐尸還是另有隱情,我是刑警寧澤放坏,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布咙咽,位于F島的核電站,受9級(jí)特大地震影響淤年,放射性物質(zhì)發(fā)生泄漏钧敞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一麸粮、第九天 我趴在偏房一處隱蔽的房頂上張望溉苛。 院中可真熱鬧,春花似錦弄诲、人聲如沸愚战。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)寂玲。三九已至塔插,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間敢茁,已是汗流浹背佑淀。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彰檬,地道東北人伸刃。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像逢倍,于是被迫代替她去往敵國(guó)和親捧颅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • * 基礎(chǔ)知識(shí) * js的輸出方式 * js的組成 * js的命名規(guī)范 * 數(shù)據(jù)類型 * number數(shù)據(jù)類型 * ...
    web前端ling閱讀 994評(píng)論 0 2
  • 數(shù)組方法的小總結(jié) 從數(shù)組末尾刪除一項(xiàng)较雕,有哪些方法碉哑?ary.length--ary.length-=1; ary.l...
    固執(zhí)_i閱讀 205評(píng)論 0 0
  • 單例模式 適用場(chǎng)景:可能會(huì)在場(chǎng)景中使用到對(duì)象,但只有一個(gè)實(shí)例亮蒋,加載時(shí)并不主動(dòng)創(chuàng)建扣典,需要時(shí)才創(chuàng)建 最常見(jiàn)的單例模式,...
    Obeing閱讀 2,056評(píng)論 1 10
  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,212評(píng)論 0 4
  • “ 媽慎玖,你又被騙了”8歲兒子淡定的看著我贮尖,我看著混在剛買的一大袋橘子里面的幾個(gè)爛了點(diǎn)點(diǎn)的橘子,心里有點(diǎn)難受趁怔。為什么...
    曉卉669閱讀 403評(píng)論 0 0