成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

使用Javascript怎么實(shí)現(xiàn)數(shù)組去重

使用Javascript怎么實(shí)現(xiàn)數(shù)組去重?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)公司專注于企業(yè)成都全網(wǎng)營(yíng)銷、網(wǎng)站重做改版、烏海海南網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、商城建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為烏海海南等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

第一種用instenceof方法

instanceof是ES5提供的一個(gè)方法,它可以用來(lái)判斷實(shí)例是否是某個(gè)類的實(shí)例,例如:

[] instenceof Array
//返回結(jié)果是true

這種方法的不好之處就是兼容性不好,對(duì)于一些低版本瀏覽器不支持ES5的就要懵逼了。

第二種方法是通過(guò)原型鏈的方式來(lái)判斷

了解js的話都應(yīng)該懂得js這個(gè)語(yǔ)言的特點(diǎn)就是原型鏈?zhǔn)降?,所有的?duì)象都繼承自Object.prototype,而prototype上又有toString()方法,這個(gè)toString()方法是干什么用的呢?就是以字符串的形式返回當(dāng)前對(duì)象的值。第一次看可能這句話可能不大明白,舉個(gè)例吧:

var num = 123;
num.toString(); //返回結(jié)果為"123"

有沒(méi)有看明白一點(diǎn)?就是返回num這個(gè)對(duì)象值的字符串形式,也就是”123”。好了,這跟判斷數(shù)組有什么關(guān)系?想一下所有的對(duì)象都繼承自Object.prototype,數(shù)組也是啊,如果把一個(gè)數(shù)組送到Object.prototype里作為一個(gè)“值”,在調(diào)用toString()方法,那它應(yīng)該顯示出這個(gè)對(duì)象的名字才對(duì)啊,這就是判斷的原理,代碼如下:

Object.prototype.toString.call([]); //結(jié)果是"[object Array]"

像jQuery這樣的腳本庫(kù)的isArray()用的就是這個(gè)方法。

數(shù)組拍平

說(shuō)完判直奔主題,先是數(shù)組拍平,什么是數(shù)組拍平呢?就是把[1,[2,[3,4],5]]鋪成[1,2,3,4,5]。關(guān)于數(shù)組拍平我有兩種思路,第二種比較奇葩,留點(diǎn)懸念吧哈哈。

第一種是常規(guī)思路

對(duì)數(shù)組進(jìn)行遍歷,如果數(shù)組里面套著數(shù)組就繼續(xù)遍歷里面的,直到把每個(gè)元素都遍歷完,然后一邊遍歷一邊塞入新的數(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<arr.length;i++){
   isArray(arr[i]) ? dealArr(arr[i]) : newArr.push(arr[i]);
  }
 };
 dealArr(arr);
 return newArr;
};
console.log(panelArr([1,[2,3]])); //[1,2,3]

當(dāng)然這個(gè)方法也可以寫(xiě)在Array.prototype里,使用起來(lái)更方便。這個(gè)方法有個(gè)問(wèn)題就是內(nèi)存占用上,因?yàn)椴捎眠f歸如果數(shù)據(jù)量大了會(huì)占用大量大量?jī)?nèi)存。

第二種奇葩思路

第二種思路就是不把數(shù)組來(lái)看,也不遍歷了直接拍平。聽(tīng)起來(lái)略奇怪,怎么能不遍歷就拍平?就是使用join()方法,將數(shù)組轉(zhuǎn)換成字符串,然后正則去掉符號(hào)最后合并,這個(gè)方法在使用注意不能join("") ,因?yàn)槿绻@樣分割的話,13是1和3還是13?不好區(qū)分,代碼如下:

var arr = [1,2,[33,43],20,19];
arr.join(".").replace(/,/g,".").split("."); //["1", "2", "33", "43", "20", "19"]

注意:這個(gè)方法會(huì)轉(zhuǎn)換數(shù)據(jù)類型成字符串。

數(shù)組去重

下面是數(shù)組去重,舉例來(lái)說(shuō)就是[1,2,3,3,4,5,5,5,6]變成[1,2,3,4,5,6]。這個(gè)實(shí)現(xiàn)的核心就是去重這里,如果能夠快速判斷元素是否重復(fù)就是關(guān)鍵。

還是兩種思路

第一種遍歷的思路

就是準(zhǔn)備一個(gè)新的數(shù)組變量,塞入前每次對(duì)這個(gè)變量進(jìn)行遍歷看看是否有重復(fù)的,如果沒(méi)有就塞入,最后生成的新數(shù)組就是去重后的數(shù)組了。示例代碼如下:

function uniqueArr(arr){
 var newArr = [];
 newArr.push(arr[0]);
 for(var i = 1; i<arr.length;i++){
 var repeat = false;
 for(var j = 0;j<newArr.length;j++){
 if(arr[i] == newArr[j]){
 repeat = true;
 }
 }
 if(!repeat){
 newArr.push(arr[i]);
 }
 }
 return newArr;
}

第二種使用哈希判斷

上面那個(gè)時(shí)間復(fù)雜度為O(n^2)的方法并不是什么好方法,它的瓶頸就是判斷是否重復(fù)這里,所以我們換成一個(gè)更高效的檢索是否重復(fù)的方法,這個(gè)方法就是哈希,為什么哈希檢索最快?翻翻數(shù)據(jù)結(jié)構(gòu)吧,這里就不在贅述了。

這個(gè)方法的思路就是在原始數(shù)組和去重?cái)?shù)組之間加入一個(gè)哈希過(guò)濾,總的來(lái)看就是原數(shù)組數(shù)據(jù)交給哈希,看是否有重復(fù),若是沒(méi)有則添加進(jìn)去。具體代碼如下:

function uniqueArr(arr){
 var newArr = [],
 hashFilter = {};
 for(var i = 0;i<arr.length;i++){
 if(!hashFilter[arr[i]]){
 //若不存在將此屬性對(duì)應(yīng)的值改為true,并塞入去重?cái)?shù)組中
 hashFilter[arr[i]] = true;
 newArr.push(arr[i]);
 }
 }
 return newArr;
}

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。

分享標(biāo)題:使用Javascript怎么實(shí)現(xiàn)數(shù)組去重
本文地址:http://jinyejixie.com/article16/jjpddg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、定制網(wǎng)站網(wǎng)站改版、手機(jī)網(wǎng)站建設(shè)微信小程序、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
尼木县| 东丽区| 金乡县| 青州市| 涞水县| 辽宁省| 霍林郭勒市| 安塞县| 东乌| 汝阳县| 汝阳县| 赣州市| 永定县| 文登市| 楚雄市| 苍山县| 留坝县| 吉林省| 丰都县| 桓仁| 勃利县| 垫江县| 广南县| 邯郸市| 巨野县| 巫山县| 灵台县| 肥西县| 黎川县| 余干县| 民权县| 界首市| 枣阳市| 樟树市| 余江县| 原平市| 巨鹿县| 格尔木市| 平泉县| 绵竹市| 上虞市|