使用Javascript怎么實現(xiàn)數(shù)組去重?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)公司專注于企業(yè)成都全網(wǎng)營銷、網(wǎng)站重做改版、烏海海南網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、商城建設(shè)、集團公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為烏海海南等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
第一種用instenceof方法
instanceof是ES5提供的一個方法,它可以用來判斷實例是否是某個類的實例,例如:
[] instenceof Array //返回結(jié)果是true
這種方法的不好之處就是兼容性不好,對于一些低版本瀏覽器不支持ES5的就要懵逼了。
第二種方法是通過原型鏈的方式來判斷
了解js的話都應(yīng)該懂得js這個語言的特點就是原型鏈?zhǔn)降模械膶ο蠖祭^承自Object.prototype
,而prototype上又有toString()
方法,這個toString()
方法是干什么用的呢?就是以字符串的形式返回當(dāng)前對象的值。第一次看可能這句話可能不大明白,舉個例吧:
var num = 123; num.toString(); //返回結(jié)果為"123"
有沒有看明白一點?就是返回num這個對象值的字符串形式,也就是”123”。好了,這跟判斷數(shù)組有什么關(guān)系?想一下所有的對象都繼承自Object.prototype
,數(shù)組也是啊,如果把一個數(shù)組送到Object.prototype
里作為一個“值”,在調(diào)用toString()
方法,那它應(yīng)該顯示出這個對象的名字才對啊,這就是判斷的原理,代碼如下:
Object.prototype.toString.call([]); //結(jié)果是"[object Array]"
像jQuery這樣的腳本庫的isArray()
用的就是這個方法。
數(shù)組拍平
說完判直奔主題,先是數(shù)組拍平,什么是數(shù)組拍平呢?就是把[1,[2,[3,4],5]]鋪成[1,2,3,4,5]。關(guān)于數(shù)組拍平我有兩種思路,第二種比較奇葩,留點懸念吧哈哈。
第一種是常規(guī)思路
對數(shù)組進行遍歷,如果數(shù)組里面套著數(shù)組就繼續(xù)遍歷里面的,直到把每個元素都遍歷完,然后一邊遍歷一邊塞入新的數(shù)組變量里,這樣就完成拍平了,具體代碼如下:
panelArr = function(arr){ var newArr = []; var isArray = function(obj) { return Object.prototype.toString.call(obj) === '[object Array]'; }; var dealArr = function(arr){ for (var i = 0;i當(dāng)然這個方法也可以寫在
Array.prototype
里,使用起來更方便。這個方法有個問題就是內(nèi)存占用上,因為采用遞歸如果數(shù)據(jù)量大了會占用大量大量內(nèi)存。第二種奇葩思路
第二種思路就是不把數(shù)組來看,也不遍歷了直接拍平。聽起來略奇怪,怎么能不遍歷就拍平?就是使用
join()
方法,將數(shù)組轉(zhuǎn)換成字符串,然后正則去掉符號最后合并,這個方法在使用注意不能join("")
,因為如果這樣分割的話,13是1和3還是13?不好區(qū)分,代碼如下:var arr = [1,2,[33,43],20,19]; arr.join(".").replace(/,/g,".").split("."); //["1", "2", "33", "43", "20", "19"]注意:這個方法會轉(zhuǎn)換數(shù)據(jù)類型成字符串。
數(shù)組去重
下面是數(shù)組去重,舉例來說就是[1,2,3,3,4,5,5,5,6]變成[1,2,3,4,5,6]。這個實現(xiàn)的核心就是去重這里,如果能夠快速判斷元素是否重復(fù)就是關(guān)鍵。
還是兩種思路
第一種遍歷的思路
就是準(zhǔn)備一個新的數(shù)組變量,塞入前每次對這個變量進行遍歷看看是否有重復(fù)的,如果沒有就塞入,最后生成的新數(shù)組就是去重后的數(shù)組了。示例代碼如下:
function uniqueArr(arr){ var newArr = []; newArr.push(arr[0]); for(var i = 1; i第二種使用哈希判斷
上面那個時間復(fù)雜度為
O(n^2)
的方法并不是什么好方法,它的瓶頸就是判斷是否重復(fù)這里,所以我們換成一個更高效的檢索是否重復(fù)的方法,這個方法就是哈希,為什么哈希檢索最快?翻翻數(shù)據(jù)結(jié)構(gòu)吧,這里就不在贅述了。這個方法的思路就是在原始數(shù)組和去重數(shù)組之間加入一個哈希過濾,總的來看就是原數(shù)組數(shù)據(jù)交給哈希,看是否有重復(fù),若是沒有則添加進去。具體代碼如下:
function uniqueArr(arr){ var newArr = [], hashFilter = {}; for(var i = 0;i看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。
網(wǎng)站欄目:使用Javascript怎么實現(xiàn)數(shù)組去重
當(dāng)前路徑:http://weahome.cn/article/jjpddg.html