javascript數(shù)組去重小結(jié)

字號(hào):


    本文給大家匯總介紹了javascript中數(shù)組去重的4種方法,分別是循環(huán)匹配去重,JSON去重/對(duì)象去重/字典去重,隊(duì)列遞歸去重,INDEXOF去重方式,非常的細(xì)致全面,有需要的小伙伴可以參考下。
    前言
    最近為了換工作,準(zhǔn)備下面試,開始回顧復(fù)習(xí)JavaScript相關(guān)的知識(shí),昨天下午想到了數(shù)組去重的相關(guān)方法,干脆整理出幾篇JavaScript算法文章,以備后用,此系列文章不定篇數(shù),不定時(shí)間,想到哪寫到哪,不保證正確性,不保證高效率,只是談?wù)剛€(gè)人理解,如有錯(cuò)誤,請(qǐng)諸位斧正。
    關(guān)于去重
    數(shù)組去重是一個(gè)比較常見的算法考察點(diǎn),實(shí)現(xiàn)去重的方式無外乎通過唯一性和非唯一性。簡(jiǎn)單來講就是挑出唯一的或者刪除不唯一的。以下所有算法都是我自己瞎命名的,請(qǐng)無視之。
    循環(huán)匹配去重
    顧名思義,就是把數(shù)組中的每一個(gè)元素都和存放元素的數(shù)組對(duì)比,遇到不重復(fù)的元素,放入新數(shù)組中,直至循環(huán)結(jié)束,由于匹配也有循環(huán),也可以稱為雙循環(huán)匹配去重,這也是大家都能想到的最簡(jiǎn)單的方式。
    實(shí)現(xiàn)代碼:
    var arr=[1,3,4,56,3,7,9,7];
    var result=[];
    //匹配
    function isMatch(array,n){
      for(var i=0;i<array.length;i++){
        if(array[i]==n){
          return true;
        }
      }
      return false;
    };
    //驗(yàn)證所有元素
    function unqiue(array){
      for(var i=0;i<array.length;i++){
        if(!isMatch(result,array[i])){
          result.push(array[i]);
        }
      }
      return result;
    };
    console.log(unqiue(arr));
    注意:上面方法有一個(gè)bug,當(dāng)存在數(shù)字和數(shù)字形式的字符串的時(shí)候,沒有區(qū)分出數(shù)字和數(shù)字字符串。因?yàn)樵谄ヅ浜瘮?shù)isMatch()里用的是雙等“==”,沒有驗(yàn)證元素類型,實(shí)際應(yīng)該使用全等“===”。
    修改后的代碼如下:
    var arr=[1,3,4,56,3,'1',7,9,7];
    var result=[];
    //匹配
    function isMatch(array,n){
      for(var i=0;i<array.length;i++){
        if(array[i]===n){
          return true;
        }
      }
      return false;
    };
    //驗(yàn)證所有元素
    function unqiue(array){
      for(var i=0;i<array.length;i++){
        if(!isMatch(result,array[i])){
          result.push(array[i]);
        }
      }
      return result;
    };
    console.log(unqiue(arr));
    算法優(yōu)缺點(diǎn):
    優(yōu)點(diǎn):
    實(shí)現(xiàn)簡(jiǎn)單,思路直觀
    缺點(diǎn):
    效率低下
    JSON去重/對(duì)象去重/字典去重
    JSON去重,簡(jiǎn)單來講就是利用Object對(duì)象key的唯一性,將數(shù)組的元素轉(zhuǎn)換為JSON或者說對(duì)象的key值。JSON的value存儲(chǔ)數(shù)組的索引index,然后對(duì)JSON對(duì)象進(jìn)行for in循環(huán),存儲(chǔ)到新數(shù)組中。
    Array、JSON、{}都是Object,所以采用任意一種都可以實(shí)現(xiàn)此算法。
    實(shí)現(xiàn)代碼:
    Array方式:
    var arr=[1,3,4,56,3,'1',7,9,7];
    function unqiue(array){
      var cache=[];
      var result=[];
       //將數(shù)組元素轉(zhuǎn)為對(duì)象的key
      for(var i=0;i<array.length;i++){
        cache[array[i]]=i;
      };
      //存儲(chǔ)key(實(shí)際的數(shù)組元素)
      for(key in cache){
        result.push(key);
      };
      return result;
    }
    console.log(unqiue(arr));
    JSON方式:
    var arr=[1,3,4,56,3,'1',7,9,7];
    function unqiue(array){
      var cache={};
      var result=[];
       //將數(shù)組元素轉(zhuǎn)為對(duì)象的key
      for(var i=0;i<array.length;i++){
        cache[array[i]]=i;
      };
      //存儲(chǔ)key(實(shí)際的數(shù)組元素)
      for(key in cache){
        result.push(key);
      };
      return result;
    }
    console.log(unqiue(arr));
    Object方式:
    var arr=[1,3,4,56,3,'1',7,9,7];
    function unqiue(array){
      var cache=new Object();
      var result=[];
       //將數(shù)組元素轉(zhuǎn)為對(duì)象的key
      for(var i=0;i<array.length;i++){
        cache[array[i]]=i;
      };
      //存儲(chǔ)key(實(shí)際的數(shù)組元素)
      for(key in cache){
        result.push(key);
      };
      return result;
    }
    console.log(unqiue(arr));
    算法優(yōu)缺點(diǎn):
    優(yōu)點(diǎn):
    簡(jiǎn)單
    效率非常高
    缺點(diǎn):
    1.改變了數(shù)組元素的類型() 
    2.有bug(無非區(qū)分?jǐn)?shù)字和數(shù)字類型字符串)
    隊(duì)列遞歸去重
    昨天晚上思忖良久想到用隊(duì)列的方式,先將數(shù)組排序成升序或降序的隊(duì)列,這樣相同的元素就處在一個(gè)區(qū)域內(nèi),然后從隊(duì)尾向前匹配,如果匹配成功,刪除隊(duì)尾,然后前一個(gè)元素再向其前面的匹配。整個(gè)匹配完成之后,剩下的元素就是去重過后的隊(duì)列。
    var arr=[6, 4, 6, 9, '6', 13, 56, 9, ,'11',1, 8, '7', 17, 5, 45, 3, 7];
    function unqiue(array){
      //排序數(shù)組,形成隊(duì)列
      array.sort(function(m,n){return m-n;});
      ////排序后,隊(duì)尾向前對(duì)比,如果相同,刪除隊(duì)尾,依次類推
      function loop(Index){
        if(Index>=1){
          if(array[Index]===array[Index-1]){
            arr.splice(Index,1);
          }
          loop(Index-1);
        }
         
      }
      loop(array.length-1);
      return array;
    }
    console.log(unqiue(arr));
    算法優(yōu)缺點(diǎn):
    優(yōu)點(diǎn):
    效率較高
    缺點(diǎn):
    效率不是最高
    INDEXOF去重方式
    判斷瀏覽器是否支持indexOf ,indexOf 為ecmaScript5新方法 IE8以下(包括IE8, IE8只支持部分ecma5)不支持
    if (!Array.prototype.indexOf){ 
    // 新增indexOf方法 
    Array.prototype.indexOf = function(item){ 
    var result = -1, a_item = null; 
    if (this.length == 0){ 
    return result; 
    } 
    for(var i = 0, len = this.length; i < len; i++){ 
    a_item = this[i]; 
    if (a_item === item){ 
    result = i; 
    break; 
    } 
    } 
    return result; 
    } 
    }