一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

JavaScript之?dāng)?shù)組去重

 昵稱10504424 2015-08-28

首先,我想到的是另建一個(gè)結(jié)果數(shù)組,用來存儲(chǔ)原始數(shù)組中不重復(fù)的數(shù)據(jù)。遍歷原始數(shù)組依次跟結(jié)果數(shù)組中的元素進(jìn)行比較,檢測(cè)是否重復(fù)。于是乎,我寫出了如下代碼A:

按 Ctrl+C 復(fù)制代碼
按 Ctrl+C 復(fù)制代碼

 

  寫完之后,忽然想起來前幾天剛看的ECMAScript 5中的數(shù)組方法 indexOf 可以檢索數(shù)組元素。于是我又使用 indexOf 方法替代了第二層循環(huán),寫出了如下代碼B:

按 Ctrl+C 復(fù)制代碼
按 Ctrl+C 復(fù)制代碼

  哈,代碼一下子從17行變成了9行了,簡(jiǎn)潔多了。高三數(shù)學(xué)大題解法一般都不止一種的啊,然后我就繼續(xù)再想其他方法了。indexOf 方法的意思是搜索整個(gè)數(shù)組中具有給定值的元素,返回找到的第一個(gè)元素的索引,沒有找到就返回 -1 ,第一個(gè)參數(shù)就是要搜索的值,第二個(gè)參數(shù)可選:它指定數(shù)組中的一個(gè)索引,從那里開始搜索,如果省略這個(gè)參數(shù),則從頭搜索。思維一發(fā)散,想到了前面方法都是 檢測(cè)值是否重復(fù)的,現(xiàn)在有了indexOf 方法不就可以根據(jù)檢測(cè)到的每個(gè)元素的第一次出現(xiàn)時(shí)的索引和這個(gè)元素自身的索引值比較相等來判斷是否重復(fù)嘛。所以,我又寫出了代碼C:

復(fù)制代碼
1 Array.prototype.clearRepetitionC = function(){
2     var result = [this[0]];
3     for(var i=1; i<this.length; i++){
4         if(this.indexOf(this[i]) == i){
5             result.push(this[i]);
6         }
7     }
8     return result;
9 } 
復(fù)制代碼

  寫完這個(gè),又繼續(xù)想了想,實(shí)在是想不出其他方法了(哎,這三個(gè)方法都是很基礎(chǔ)的方法,數(shù)據(jù)結(jié)構(gòu)、算法沒學(xué)好,真心想不出啥驚天地、泣鬼神的牛逼 方法來)。于是,我就去對(duì)照答案,檢驗(yàn)自己了。一看答案,發(fā)現(xiàn)自己還是真實(shí)太弱了,簡(jiǎn)單的問題還是有些奇思妙想的。下面不是自己想的了,就不再說太多我的 心路歷程了。廢話不多說,直接上經(jīng)典的答案+解析了。

  首先,先說一個(gè)算法中經(jīng)常說的以空間換時(shí)間的解法,保持隊(duì)形,我們就叫它代碼D吧:

復(fù)制代碼
 1 Array.prototype.clearRepetitionD = function(){
 2     var result = [];
 3     var obj = {};
 4     var key,type;
 5     for(var i=0; i<this.length; i++){
 6         key = this[i];
 7         type = typeof key;
 8         if(!obj[key]){
 9             obj[key] = [type];
10             result.push(key);
11         }else if(obj[key].indexOf(type)){
12             obj[key].push(type);
13             result.push(key);
14         }
15     }
16     return result;
17 } 
復(fù)制代碼

  這個(gè)方法中在遍歷原始數(shù)組時(shí)用一個(gè)對(duì)象 obj 的屬性來保存原始數(shù)組中元素的值。同時(shí)這個(gè)屬性的值是一個(gè)數(shù)組,用來存儲(chǔ)這個(gè)屬性的類型,這一點(diǎn)可以把原始數(shù)組中類似數(shù)字1元素和字符串‘1’的元素區(qū)分 開。這個(gè)方法通過額外構(gòu)建一個(gè)對(duì)象的方式降低了上面三種方法中indexOf方法所花費(fèi)的時(shí)間,可以說較為高效吧。

  如果你已經(jīng)滿足于上面所說的以空間換時(shí)間的高效方法而不繼續(xù)看下去的話,那就大錯(cuò)特錯(cuò)了,好戲總在后頭嘛。現(xiàn)在好戲開場(chǎng),毫無疑問,就是代碼E了:

復(fù)制代碼
 1 Array.prototype.clearRepetitionE = function(){
 2     var result = [];
 3     for(var i=0; i<this.length; i++){
 4         for(var j=i+1; j<this.length; j++){
 5             if(this[i] === this[j]){
 6                 j = ++i;
 7             }
 8         }
 9         result.push(this[i]);
10     }
11     return result;
12 } 
復(fù)制代碼

  代碼D以空間換時(shí)間,感覺也就一般般。那么代碼E呢?我擦,這代碼是錯(cuò)誤的吧,這個(gè)真的能去重嗎?是的,起初我都沒看懂這代碼,看了解析后又看 了一遍之后才明白過來。那么,沒看懂的看官也要認(rèn)真的看解析了:第一層從前往后遍歷原始數(shù)組,第二層循環(huán)是檢測(cè)每個(gè)元素是否跟它之后的元素重復(fù),如果它之 后有重復(fù)元素則跳過它;如果這個(gè)元素之后所有元素都跟他不重復(fù)了,則把它添加到結(jié)果數(shù)組中。這個(gè)方法實(shí)現(xiàn)思路就是:獲取無重復(fù)的最右一值添加到結(jié)果數(shù)組 中,這個(gè)跟第一種方法相比也優(yōu)化了第二層的循環(huán),效率要比它高,不過這個(gè)方法的結(jié)果數(shù)組中元素的順序跟原始數(shù)組中元素的順序不一樣了。

  看完了代碼E解析的你是不是已經(jīng)伸出了大拇指、投放出了敬佩的目光呢?(這些鮮花和榮譽(yù)別給我,應(yīng)該給寫這個(gè)方法的大神去)。下面再說最后一個(gè)方法:那就是先排序,再去重。老規(guī)矩,它叫代碼F:

復(fù)制代碼
 1 Array.prototype.clearRepetitionF = function(){
 2     this.sort();
 3     var result = [this[0]];
 4     for(var i=1; i<this.length; i++){
 5         if(this[i] !== result[result.length-1]){
 6             result.push(this[i]);
 7         }
 8     }
 9     return result;
10 } 
復(fù)制代碼

  這個(gè)先用數(shù)組的排序方法sort進(jìn)行數(shù)組元素排序,然后再進(jìn)行去重工作。這個(gè)效率真的會(huì)高嗎?哎,沒學(xué)好算法什么的,我的答案也就三個(gè)字:不知道。如果你知道歡迎評(píng)論區(qū)告訴我。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    少妇成人精品一区二区| 欧美成人免费一级特黄| 国产欧美亚洲精品自拍| 成人三级视频在线观看不卡| 亚洲黄片在线免费小视频| 日本人妻丰满熟妇久久| 欧美黑人黄色一区二区| 国产精品欧美激情在线播放| 国产亚洲成av人在线观看| 韩国日本欧美国产三级 | 91亚洲国产—区=区a| 99免费人成看国产片| 激情内射日本一区二区三区 | 日韩精品小视频在线观看| 一级片黄色一区二区三区| 少妇在线一区二区三区| 国产传媒免费观看视频| 日本91在线观看视频| 最新69国产精品视频| 午夜福利视频日本一区| 国产成人免费高潮激情电| 欧美自拍偷自拍亚洲精品| 国产精品一区二区不卡中文| 少妇福利视频一区二区| 国产精品一区二区三区欧美| 日韩高清毛片免费观看| 欧美黄色黑人一区二区| 欧美精品在线播放一区二区| 大尺度剧情国产在线视频| 老熟妇乱视频一区二区| 国产一区欧美午夜福利| 亚洲男人的天堂就去爱| 亚洲伦片免费偷拍一区| 欧美国产极品一区二区| 国产又粗又爽又猛又黄的| 免费一区二区三区少妇| 东京热一二三区在线免| 日本理论片午夜在线观看| 亚洲日本韩国一区二区三区| 日本人妻精品中文字幕不卡乱码 | 日韩精品你懂的在线观看|