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

javascript實現(xiàn)數(shù)組去重的多種方法

 更新時間:2016年03月14日 11:37:45   作者:凌云之翼  
這篇文章主要為大家詳細介紹了javascript實現(xiàn)數(shù)組去重的多種方法,感興趣的小伙伴們可以參考一下

廢話不多說,直接拿干貨!

先說說這個實例的要求:寫一個方法實現(xiàn)數(shù)組的去重。(要求:執(zhí)行方法,傳遞一個數(shù)組,返回去重后的新數(shù)組,原數(shù)組不變,實現(xiàn)過程中只能用一層循環(huán),雙層嵌套循環(huán)也可寫,只做參考);

先給初學者解釋一下什么叫數(shù)組去重(老鳥跳過):意思就是講數(shù)組里面重復的元素去掉,比如說var arr = [3,2,4,2,1,2]; 數(shù)組去重得到的新數(shù)組是 [3,2,4,1],就是這么一個功能。

實現(xiàn)方法比較簡單,實現(xiàn)的方式也比較多,很多大牛也寫過相關(guān)的文章,之所以寫這邊博客,旨在一是備忘,二是給初學者能更好的理解其實現(xiàn)的原理,好,我們看第一種實現(xiàn)方式:

第一種,通過遍歷新數(shù)組來去重

var arr = [1,'b','b',4,3,3,4,5,1];
     
    //第一種
    Array.prototype.unique1 = function(){
      var arr1 = []; //定義一個新數(shù)組
      for(var i=0;i<this.length;i++){
        if(arr1.indexOf(this[i]) == -1){//判斷目標數(shù)組中在原數(shù)組里是否存在
          arr1.push(this[i]);
        } 
      } 
      return arr1;
    }
    console.log(arr); //[1,'b','b',4,3,3,4,5,1]
    console.log(arr.unique1()); //[1, "b", 4, 3, 5]
    //這種方法的主要思路就是,新建一個數(shù)組,然后在原數(shù)組中,從第一個開始,看看新數(shù)組里面有沒有這個元素,如果有,就忽略,然后進行下一個,如果沒有,則把這個元素存到新數(shù)組里面,
    //也就是說,每一次比較,都會遍歷新數(shù)組,直到找到相同元素為止,比較耗性能

如果大家不習慣這個寫法,可以改成下面的寫法,效果是一樣的:

var arr = [1,'b','b',4,3,3,4,5,1];

function unique1(arr){
      var arr1 = [];
      for(var i=0;i<arr.length;i++){
        if(arr1.indexOf(arr[i]) == -1){//判斷目標數(shù)組中在原數(shù)組里是否存在
          arr1.push(arr[i]); 
        } 
      } 
      return arr1;
    }
    console.log(arr); //[1,'b','b',4,3,3,4,5,1]
    console.log(unique1(arr)); //[1, "b", 4, 3, 5]

下面的方法我就不改寫法了,你們可以按照上面的格式來改寫一下,結(jié)果我也不輸出了,因為結(jié)果是一樣的,注釋寫在代碼中,慢慢體會一下

第二種,通過hash表(這個概念有點大,具體原理就不在這里細說了,有時間我會單獨寫一遍,這是好東西)實現(xiàn)

var arr = [1,'b','b',4,3,3,4,5,1];

Array.prototype.unique2 = function(){
      var hash = {}; //定義一個hash表
      var arr1 = []; //定義一個新數(shù)組
      for(var i=0;i<this.length;i++){
        /*
          這里比較難理解,我們一步一步來看:
          hash是一個對象,則存在鍵值對(key:value),只不過現(xiàn)在是為空的,所以hash[key] = value;
          第一步:i=0;this[i]=this[0]=1; hash[this[0]] = hash[1] , 因為hash初始為空,沒有找到key=1的值,所以然后undefined,
          執(zhí)行下一步:hash[1] = true(此時hash對象就有了第一組鍵值對),將原數(shù)組的第一個數(shù)添加到新數(shù)組中,重復第一步
          因為不重復的判斷hash的值都是undefined,而重復的都為true了,所以不重復都被添加到新數(shù)組中
          因為hash表存的值是存的地址,放在堆內(nèi)存中,所以有多少個不重復的元素,就要分多少個內(nèi)存來存放,所以這種方法比較占內(nèi)存,但是相比之下,這種的運算運動是最快的,
          這也就是用空間來換取時間了,數(shù)據(jù)量比較小,推薦用此方法
        */
        if(! hash[this[i]]){
          hash[this[i]] = true;
          arr1.push(this[i]);
        }
      }
      return arr1;  
    }
    console.log(arr);
    console.log(arr.unique2());


第三種,通過遍歷自身的位置是否一致來實現(xiàn)

var arr = [1,'b','b',4,3,3,4,5,1];

Array.prototype.unique3 = function(){
      var arr1 = []; //定義一個新數(shù)組
      for(var i=0;i<this.length;i++){
        if(this.indexOf(this[i])==i){
        //這里也是indexOf遍歷,看從第一個元素在原數(shù)組中的位置,如果第一次出現(xiàn)的位置和下標相等,說明當前元素的不重復的,如果不等,說明該元素前面已經(jīng)出現(xiàn)過
          arr1.push(this[i]);
        }
      }
      return arr1;  
    }
    console.log(arr);
    console.log(arr.unique3());


第四種,這個有點意思,只能運用到特殊場合,就是先跟數(shù)組排序,然后22比較,輸出一個排序過的新數(shù)組

Array.prototype.unique4 = function(){
      /*
        這里是思路是,先排序(默認從小到大),然后將原數(shù)組的第一個給新數(shù)組,
        因為是經(jīng)過排序的,所以重復的只會存在在相鄰位置
        這里就相當于是做22比較,如果相等,則進行下一組,如果不相等,則把這個數(shù)存到新數(shù)組中,用這個數(shù)再進行比較
      */
      this.sort();
      var arr1 = [this[0]];
      for(var i=1;i<this.length;i++){
        if(this[i] !== arr1[arr1.length-1]){
          arr1.push(this[i]);
        } 
      }
      return arr1;  
    }
    console.log(arr);
    console.log(arr.unique4());

哇哈,打完收工!

要求里面還說,可以使用雙層嵌套循環(huán)來實現(xiàn),無法就是用2層for循環(huán),讓每一個與原數(shù)組去比較

Array.prototype.unique5 = function(){
      //雙層循環(huán),一一比較
      for(var i=0;i<this.length;i++){ //從0開始
        for(j= i+1;j<this.length;j++){ //從1開始,逐個比較
          if(this[i] === this[j]){ //如果恒定
            this.splice(j,1);  //就將這個元素刪掉
          } 
        } 
      }
      return this;  
    }
    console.log(arr);
    console.log(arr.unique5());

這種寫法的循環(huán)次數(shù)太多,不推薦,有人會說,第一種和第三種不也是每次都遍歷一遍嗎?跟第5種感覺也差不多呢?是的,你能這么理解,說明你理解了,但是呢,又不是特別的理解,我們說差不多那可就差太多了,indexOf()表示的是找到第一個匹配的元素就會

停止遍歷,而第5種則是不管找不找得到,都會把整個數(shù)組遍歷一遍,如果數(shù)據(jù)量大,那你覺得哪個性能要好一點?

特別注意的一點:如果在比較兩兩之間的值是全等或不等的時候,一定要用恒定(===)和不恒定(!==),因為這會涉及到元素的類型上,如 1與'1'是不恒等的!

上面的可真是干貨了,一點水分都沒有,只能靠大家自己領悟了!

相關(guān)文章

  • MvcPager分頁控件 適用于Bootstrap

    MvcPager分頁控件 適用于Bootstrap

    這篇文章主要為大家詳細介紹了MvcPager分頁控件,修改后適用于Bootstrap,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • JavaScript實現(xiàn)的多個圖片廣告交替顯示效果代碼

    JavaScript實現(xiàn)的多個圖片廣告交替顯示效果代碼

    這篇文章主要介紹了JavaScript實現(xiàn)的多個圖片廣告交替顯示效果代碼,涉及javascript數(shù)組遍歷及頁面元素動態(tài)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • Three.js使用OrbitControls后修改相機旋轉(zhuǎn)方向無效解決辦法

    Three.js使用OrbitControls后修改相機旋轉(zhuǎn)方向無效解決辦法

    three.js是用javascript寫的基于webGL的第三方3D庫,下面這篇文章主要給大家介紹了關(guān)于Three.js使用OrbitControls后修改相機旋轉(zhuǎn)方向無效的解決辦法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • javasript實現(xiàn)密碼的隱藏與顯示

    javasript實現(xiàn)密碼的隱藏與顯示

    用戶輸入密碼時都是顯示的星號了,那么我們希望查看明文要怎么查看呢,下面我們只要使用一段簡單的js就可以實現(xiàn)查看密碼框的明文了,有需要的小伙伴可以來參考下。
    2015-05-05
  • JavaScript DOM事件(筆記)

    JavaScript DOM事件(筆記)

    這篇文章主要介紹了JavaScript DOM事件(筆記) ,需要的朋友可以參考下
    2015-04-04
  • javascript函數(shù)特點實例分析

    javascript函數(shù)特點實例分析

    這篇文章主要介紹了javascript函數(shù)特點,實例分析了javascript函數(shù)傳遞參數(shù)及調(diào)用方法,需要的朋友可以參考下
    2015-05-05
  • JavaScript動態(tài)檢驗密碼強度的實現(xiàn)方法

    JavaScript動態(tài)檢驗密碼強度的實現(xiàn)方法

    平時我們會在某些網(wǎng)站的注冊頁面或者更改密碼的頁面發(fā)現(xiàn)當我們輸入密碼時,會有一個類似于進度條的長條進行提示用戶輸入的密碼強度。那么這種效果怎么實現(xiàn)的呢?下面小編給大家介紹下js動態(tài)檢驗密碼強度的實現(xiàn)方法,一起看看吧
    2016-11-11
  • bootstrap-wysiwyg結(jié)合ajax實現(xiàn)圖片上傳實時刷新功能

    bootstrap-wysiwyg結(jié)合ajax實現(xiàn)圖片上傳實時刷新功能

    這篇文章主要為大家詳細介紹了bootstrap-wysiwyg結(jié)合ajax實現(xiàn)圖片上傳實時刷新功能,感興趣的小伙伴們可以參考一下
    2016-05-05
  • js中編碼函數(shù):escape,encodeURI與encodeURIComponent詳解

    js中編碼函數(shù):escape,encodeURI與encodeURIComponent詳解

    escape(), encodeURI()和encodeURIComponent()是在Javascript中用于編碼字符串的三個常用的方法,而他們之間的異同卻困擾了很多的Javascript初學者,這篇文章詳細的給大家介紹了js中編碼函數(shù):escape,encodeURI與encodeURIComponent的相關(guān)資料,需要的朋友可以參考下。
    2017-03-03
  • 關(guān)于前端小程序中.env?文件夾示例詳解

    關(guān)于前端小程序中.env?文件夾示例詳解

    這篇文章主要給大家介紹了關(guān)于前端小程序中.env?文件夾的相關(guān)資料,.env文件夾允許開發(fā)者在不同的環(huán)境中配置不同的變量值,以便在小程序的不同階段或環(huán)境中使用,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-05-05

最新評論

浦城县| 巴塘县| 浏阳市| 永顺县| 湘乡市| 安阳县| 镇沅| 应用必备| 化隆| 海晏县| 射阳县| 峨眉山市| 东辽县| 博爱县| 保山市| 吉木萨尔县| 阿图什市| 兰西县| 桦川县| 图们市| 德阳市| 张家港市| 大田县| 彰化市| 老河口市| 新干县| 临城县| 安丘市| 孟村| 海兴县| 蒙阴县| 从化市| 雷山县| 嫩江县| 新河县| 深州市| 天峻县| 连山| 武川县| 中超| 色达县|