最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript數(shù)組去掉重復(fù)

 更新時(shí)間:2011年05月12日 23:27:46   作者:  
去tx面試過幾次,基本都會(huì)考到數(shù)組去重。其實(shí)平時(shí)工作中幾乎不會(huì)用到,再者也沒認(rèn)真去了解過,所以基本上每次面到這里都會(huì)露出很大的馬腳,面試自然也over了
總得來說面試的過程還是收獲了不少,主要是認(rèn)清自己的差距到底有多大,知識(shí)面到底有多窄,適當(dāng)打擊一下自信心還是有必要的。在這里做一次全面的總結(jié),關(guān)于javascript的數(shù)組去重問題。

考慮一個(gè)問題由簡(jiǎn)到繁相對(duì)容易接受一點(diǎn),首先假設(shè)要去重的數(shù)組是比較簡(jiǎn)單的,例如:
復(fù)制代碼 代碼如下:

var arr=[1,2,2,3,'5',6,5,'',' ']

這個(gè)數(shù)組只包含了數(shù)字,字符串兩種類型。我們給數(shù)組原型上面添加去重的方法distinct,用第一種很容易想到的方法來實(shí)現(xiàn),當(dāng)然也是很笨很直接的,把這個(gè)數(shù)組復(fù)制一份然后循環(huán)兩個(gè)數(shù)組,對(duì)比當(dāng)前值與后面所有的值是否相等,如果與后面所有值都不等則把該值存到新數(shù)組里,如此最后再返回該新數(shù)組。方法如下:
復(fù)制代碼 代碼如下:

//第一種方法
Array.prototype.distinct=function(){
var clone,newArr=[],n=0;
if(this.length<2)return;
clone=this;
for(var i=0,len=this.length;i<len;i++){
for(var j=i+1,len2=clone.length;j<len2;j++){
if(this[i]!==clone[j]){
n++;
}
}
if(n==(len-i-1)){
newArr.push(this[i])
}
n=0;
}
return newArr;
}
console.log([1,2,2,3,'5',6,5,'',' '].distinct());
/*獲得被check的radio的值*/
function GetRadioValue(RadioName){
var obj;
obj=document.getElementsByName(RadioName);
if(obj!=null){
var i;
for(i=0;i<obj.length;i++){
if(obj[i].checked){
return obj[i].value;
}
}
}
return null;
}

/*設(shè)置被選中屬性*/
function SetRadioCheck(RadioName,i){
var obj;
obj=document.getElementsByName(RadioName);
obj[i].setAttribute("checked","checked");
}

基本可以滿足我們的需求,對(duì)這樣簡(jiǎn)單的類型比較確實(shí)不用費(fèi)太多的腦經(jīng),但如果數(shù)組很長(zhǎng)呢?如此遍歷數(shù)組,數(shù)組長(zhǎng)度為n,那么時(shí)間復(fù)雜度為n*n。顯然該方法性能還有待提升。接下來是第二種方法,用到數(shù)組排序,在排序的過程去除重復(fù)的值。
復(fù)制代碼 代碼如下:

//第二種方法
Array.prototype.distinct=function(){
var newArr=this.concat().sort(),self=this;
newArr.sort(function(a,b){
var n;
if(a===b){
n=self.indexOf(a);
self.splice(n,1);
}
});
return self;
}
console.log([1,2,2,3,'5',6,5,6,6,15,5,'5',5,'',' '].distinct());

這樣代碼看起來似乎短了很多,甚至連一個(gè)for循環(huán)都沒有,但是sort得效率也高不到哪里去。再來看看第三種實(shí)現(xiàn)方法,用到的對(duì)象屬性不會(huì)重名的原理
復(fù)制代碼 代碼如下:

//第三種方法
Array.prototype.distinct=function(){
var newArr=[],obj={};
for(var i=0,len=this.length;i<len;i++){
if(!obj[this[i]]){
newArr.push(this[i]);
obj[this[i]]='new';
}
}
return newArr;
}
console.log([1,2,2,3,'5',6,5,6,6,15,5,'5',5,'',' '].distinct());

第三種方法運(yùn)行看下結(jié)果,會(huì)發(fā)現(xiàn)跟上面的方法實(shí)現(xiàn)的結(jié)果不一致,細(xì)看原來它把數(shù)字5和字符串5當(dāng)成重復(fù)的值給去掉了??磥眍愋捅仨毐4嫫饋砣缓笤倥袛嗍欠裣嗟?,這樣便有了下面的第三種方法的補(bǔ)充版
復(fù)制代碼 代碼如下:

//第三種方法補(bǔ)充版
Array.prototype.distinct=function(){
var newArr=[],obj={};
for(var i=0,len=this.length;i<len;i++){
if(!obj[typeof(this[i])+this[i]]){
newArr.push(this[i]);
obj[typeof(this[i])+this[i]]='new';
}
}
return newArr;
}

上面舉的例子是很簡(jiǎn)單的類型,我們拿更復(fù)雜的類型來測(cè)試一下
復(fù)制代碼 代碼如下:

console.log([1,null,2,{a:'vc'},{},'5',6,5,6,{a:'vv'},15,5,'5',5,'',' ',[1],[1],[1,2],,].distinct());

發(fā)現(xiàn){a:'vc'},{},{a:'vv'}這些不同的對(duì)象還是會(huì)被剔除掉,如果數(shù)組里面有對(duì)象則要繼續(xù)遍歷對(duì)象里面的屬性和值,繼續(xù)第三種方法的加強(qiáng)
復(fù)制代碼 代碼如下:

//第三種方法加強(qiáng)版
Array.prototype.distinct=function(){
var sameObj=function(a,b){
var tag = true;
if(!a||!b)return false;
for(var x in a){
if(!b[x])
return false;
if(typeof(a[x])==='object'){
tag=sameObj(a[x],b[x]);
}else{
if(a[x]!==b[x])
return false;
}
}
return tag;
}
var newArr=[],obj={};
for(var i=0,len=this.length;i<len;i++){
if(!sameObj(obj[typeof(this[i])+this[i]],this[i])){
newArr.push(this[i]);
obj[typeof(this[i])+this[i]]=this[i];
}
}
return newArr;
}

用上面的例子測(cè)試發(fā)現(xiàn)基本木有問題,當(dāng)然測(cè)試還可以更加變態(tài)更加糾纏,這里就不去深究了,目前來看此篇方法在網(wǎng)上屬于比較齊全的,如果有更好更完善的方法請(qǐng)不吝賜教。

相關(guān)文章

  • js實(shí)現(xiàn)淡入淡出輪播切換功能

    js實(shí)現(xiàn)淡入淡出輪播切換功能

    本文主要分享了javascript實(shí)現(xiàn)淡入淡出輪播切換功能的示例代碼。具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • javascript編程實(shí)現(xiàn)棧的方法詳解【經(jīng)典數(shù)據(jù)結(jié)構(gòu)】

    javascript編程實(shí)現(xiàn)棧的方法詳解【經(jīng)典數(shù)據(jù)結(jié)構(gòu)】

    這篇文章主要介紹了javascript編程實(shí)現(xiàn)棧的方法,簡(jiǎn)單說明了棧的概念、特點(diǎn)并結(jié)合實(shí)例形式分析了javascript棧的定義、入棧、出棧等操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-04-04
  • php register_shutdown_function函數(shù)詳解

    php register_shutdown_function函數(shù)詳解

    register_shutdown_function() 函數(shù)可實(shí)現(xiàn)當(dāng)程序執(zhí)行完成后執(zhí)行的函數(shù),其功能為可實(shí)現(xiàn)程序執(zhí)行完成的后續(xù)操作,需要的朋友可以參考下
    2017-07-07
  • JavaScript 加號(hào)(+)運(yùn)算符號(hào)

    JavaScript 加號(hào)(+)運(yùn)算符號(hào)

    在一些框架中看到了類似這樣的寫法:+new Date();感覺有些怪,查閱了相關(guān)資料和一些網(wǎng)友的幫助.對(duì)此用法解釋如下,希望對(duì)大家有所幫助,不合適的地方請(qǐng)大家指正!
    2009-12-12
  • js中獲取一個(gè)月有多少天數(shù)的方法

    js中獲取一個(gè)月有多少天數(shù)的方法

    這篇文章主要介紹了js中獲取一個(gè)月有多少天的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • H5基于iScroll實(shí)現(xiàn)下拉刷新和上拉加載更多

    H5基于iScroll實(shí)現(xiàn)下拉刷新和上拉加載更多

    這篇文章主要為大家詳細(xì)介紹了H5基于iScroll實(shí)現(xiàn)下拉刷新和上拉加載更多效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 詳解TypeScript中枚舉的使用

    詳解TypeScript中枚舉的使用

    枚舉是 TypeScript 中一個(gè)非常有趣且實(shí)用的特性,它可以讓我們更好地組織和管理代碼,下面就來和大家聊聊TypeScript中枚舉的具體使用吧
    2023-06-06
  • 詳解webpack-dev-server使用方法

    詳解webpack-dev-server使用方法

    這篇文章主要介紹了詳解webpack-dev-server使用方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • 淺析JavaScript中var that=this

    淺析JavaScript中var that=this

    this是Javascript語(yǔ)言的一個(gè)關(guān)鍵字。它代表函數(shù)運(yùn)行時(shí),自動(dòng)生成的一個(gè)內(nèi)部對(duì)象,只能在函數(shù)內(nèi)部使用。接下來通過本文給大家分享JavaScript中var that=this所代表的意思,需要的朋友參考下吧
    2017-02-02
  • js實(shí)現(xiàn)九宮格圖片半透明漸顯特效的方法

    js實(shí)現(xiàn)九宮格圖片半透明漸顯特效的方法

    這篇文章主要介紹了js實(shí)現(xiàn)九宮格圖片半透明漸顯特效的方法,涉及js操作css特效的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-02-02

最新評(píng)論

丁青县| 梁河县| 普宁市| 丹棱县| 临海市| 土默特左旗| 金坛市| 那坡县| 文成县| 新疆| 长汀县| 四会市| 马龙县| 肇州县| 页游| 西青区| 鄂州市| 高唐县| 朝阳县| 项城市| 会同县| 怀远县| 沙田区| 崇义县| 双牌县| 都江堰市| 新沂市| 辉县市| 嘉义县| 泽普县| 德化县| 凤城市| 阳曲县| 昌图县| 富川| 扎鲁特旗| 黑山县| 河曲县| 共和县| 平泉县| 静海县|