摘要:第一種常規(guī)法最直觀的思路創(chuàng)建一個(gè)新數(shù)組如果新數(shù)組中已經(jīng)包含了當(dāng)前的第個(gè)元素,那么跳過否則把當(dāng)前項(xiàng)到新數(shù)組中輸出這種方法用到了方法。特殊情況當(dāng)數(shù)組中既有數(shù)字又有字符串的時(shí)候,如此時(shí)希望和都保留,那么上述的方法無法達(dá)到要求。
第一種:常規(guī)法(最直觀的思路)
function unique(arr){ var n = []; //創(chuàng)建一個(gè)新數(shù)組 for(var i = 0; i < arr.length; i++) { //如果新數(shù)組中已經(jīng)包含了當(dāng)前的第i個(gè)元素,那么跳過 if (n.indexOf(arr[i]) == -1) { //否則把當(dāng)前項(xiàng)push到新數(shù)組中 n.push(arr[i]); } } return n; } var array = [4,2,4,6,1,2,4,7,8]; console.log(unique(array)); //輸出[4,2,6,1,7,8]
這種方法用到了indexOf方法。其目的是尋找參數(shù)在數(shù)組中第一次出現(xiàn)的位置。很顯然,js引擎在實(shí)現(xiàn)這個(gè)方法的時(shí)候會(huì)遍歷數(shù)組直到找到目標(biāo)為止。所以此函數(shù)會(huì)浪費(fèi)掉很多時(shí)間,效率并不高。
第二種:hash()表
function unique(arr){ var n = []; var hash = {}; for(var i = 0; i < arr.length; i++){ if (!hash[arr[i]]) { hash[arr[i]] = 1; n.push(arr[i]) } } return n; } var array = [4,2,4,6,1,2,4,7,8]; console.log(unique(array));//輸出[4,2,6,1,7,8]
當(dāng)for循環(huán)遍歷數(shù)組時(shí),每次取出一個(gè)元素與hash表中的對(duì)象進(jìn)行對(duì)比,如果這個(gè)元素不重復(fù),則把它存放到結(jié)果數(shù)組中,同時(shí)把這個(gè)元素的內(nèi)容作為對(duì)象的一個(gè)屬性,并賦值為1,存入到hash表中。
第三種:先排序在比較相鄰元素
function unique(arr){ arr.sort(); var n = [arr[0]]; for(var i = 1; i < arr.length; i++){ if(arr[i] !== n[n.length-1]){ n.push(arr[i]); } } return n; } var array = [4,2,4,6,1,2,4,7,8]; console.log(unique(array)); //輸出[1,2,4,6,7,8]
排序的時(shí)候用的JS原生的sort方法,JS引擎內(nèi)部用的快速排序。最終測(cè)試的結(jié)果是此方法運(yùn)行時(shí)間比上面兩種都快了不少。
特殊情況:
當(dāng)數(shù)組中既有數(shù)字又有字符串的時(shí)候,如:var arr = [4,2,4,6,1,"2",4,7,8],此時(shí)希望2和"2"都保留,那么上述的方法無法達(dá)到要求。
第四種:
function unique(arr){ var n = []; var hash = {}; for(var i = 0; i < arr.length; i++){ if (!hash[typeof(arr[i])+arr[i]]) { hash[typeof(arr[i])+arr[i]] = 1; n.push(arr[i]) } } return n; } var array = [4,2,4,6,1,"2",4,7,8]; console.log(unique(array));//輸出[4,2,6,1,"2",7,8]
在 JavaScript 里,對(duì)象的鍵值只能是字符串,因此需要 typeof(arr[i])+arr[i] 來區(qū)分?jǐn)?shù)值 2 和字符串 "2" 的情況。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80261.html
摘要:注方法可以返回某個(gè)指定字符串在字符串中首次出現(xiàn)的位置比如首次出現(xiàn)的位置是數(shù)組中的第一個(gè),即下標(biāo)為遍歷數(shù)組使用標(biāo)識(shí)符去重聲明一個(gè)變量標(biāo)識(shí)排序后遍歷過濾數(shù)組思路先給數(shù)組排序,這樣相同的項(xiàng)總是相鄰。 假設(shè)我們有數(shù)組arr,并且聲明新數(shù)組hash用來存放去重后的元素: var arr = [23,44,5,2,23,5,1,7,8,7]; //包含重復(fù)元素 var hash= [];...
摘要:數(shù)組去重看了網(wǎng)上很多數(shù)組去重方法,用的比較常見的大概就幾種,今天想自己來做一個(gè)總結(jié)。還有就是方法返回的數(shù)組也是排序后的數(shù)組,某些情況下可能不符合要求。 JS數(shù)組去重 看了網(wǎng)上很多數(shù)組去重方法,用的比較常見的大概就幾種,今天想自己來做一個(gè)總結(jié)。部分內(nèi)容參考該博客 1 . 在原數(shù)組上操作(基本方法) 思路:利用循環(huán)嵌套,判斷數(shù)組中每個(gè)元素與其后面的元素是否相等,如果相等,就使用spli...
摘要:將元素作為對(duì)象的鍵,默認(rèn)鍵對(duì)應(yīng)的值為如果對(duì)象中沒有這個(gè)鍵,則將這個(gè)元素放入結(jié)果數(shù)組中去。 前言 數(shù)組去重在日常開發(fā)中的使用頻率還是較高的,也是網(wǎng)上隨便一抓一大把的話題,所以,我寫這篇文章目的在于歸納和總結(jié),既然很多人都在提的數(shù)組去重,自己到底了解多少呢。又或者是如果自己在開發(fā)中遇到了去重的需求,自己能想到更好的解決方案嗎。 這次我們來理一理怎么做數(shù)組去重才能做得最合適,既要考慮兼容性,...
摘要:數(shù)組去重,一般會(huì)在面試的時(shí)候才會(huì)碰到,要求手寫數(shù)組去重方法的代碼。在實(shí)際項(xiàng)目中碰到的數(shù)組去重,一般都是后臺(tái)去處理,很少讓前端處理數(shù)組去重。數(shù)組去重的方法一利用去重中最常用如果不考慮兼容性,這種去重的方法代碼最少。 數(shù)組去重,一般會(huì)在面試的時(shí)候才會(huì)碰到,要求手寫數(shù)組去重方法的代碼。如果是被提問到,數(shù)組去重的方法有哪些?你能答出其中的10種,面試官很有可能對(duì)你刮目相看。 在實(shí)際項(xiàng)目中碰到的...
閱讀 1533·2021-11-23 09:51
閱讀 3646·2021-09-26 09:46
閱讀 2135·2021-09-22 10:02
閱讀 1851·2019-08-30 15:56
閱讀 3333·2019-08-30 12:51
閱讀 2235·2019-08-30 11:12
閱讀 2069·2019-08-29 13:23
閱讀 2331·2019-08-29 13:16