zoukankan      html  css  js  c++  java
  • JS数组去重的6种算法实现

    1.遍历数组法
    最简单的去重方法,实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中;注意点:判断值是否在数组的方法“indexOf”是ECMAScript5 方法,IE8以下不支持,需多写一些兼容低版本浏览器代码,源码如下:

    var arr = [1,3,5,7,9,1,9,5,9,3,5,11,13];
    function unique1(array){
    var newArr=[];//新建一个新数组
     //遍历参数数组array
    for(var i=0;i<array.length;i++){
     //判断新数组是否有这个元素值,没有的话,就把arr[i]给push到新数组newArr中
     if(newArr.indexOf(array[i])===-1){
     newArr.push(arr[i]);
       }
       }
      return newArr;
     }
    console.log(unique1(arr));
    

    效果如下:

    5640239-bc3c9e5f2306baa5.png
    图片.png

    2.对象键值对法
    该方法执行的速度比其他任何方法都快, 就是占用的内存大一些,实现思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,不是的话给对象新增该键并放入新数组。注意 点: 判断是否为js对象键时,会自动对传入的键执行“toString()”,不同的键可能会被误认为一样;例如: a[1]、a["1"] 。解决上述问题还是得调“indexOf”。

    var arr = [1,3,5,7,9,1,9,5,9,3,5,11,13];
    // 速度最快, 占空间最多(空间换时间) 
    function unique2(array){
    var json={},newArr=[],val,type;
    for(var i=0;i<array.length;i++){
    val=array[i];
     //判断val是什么数据类型
    type=typeof val;
    console.log("判断类型"+[type]);
    //判断值是否为js对象的键,不是的话给对象新增该键并放入新数组
     if(!json[val]){
    json[val]=[type];
     newArr.push(val);
    }
    else if(json[val].indexOf(type)<0){
     json[val].push(type);
     newArr.push(val);
                        }
                    }
    return newArr;
                }
     console.log(unique2(arr));
    

    效果如下:

    5640239-ef68fdbeaf6dc958.png
    图片.png

    3.数组下标判断法
    还是得调用“indexOf”性能跟方法1差不多,实现思路:如果当前数组的第i项在当前数组中第一次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入结果数组。

    var arr = [1,3,5,7,9,1,3,5];
            function unique3(array){ 
    var n = [array[0]]; //结果数组 
    //从第二项开始遍历 
    for(var i = 1; i < array.length; i++) { 
    //如果当前数组的第i项在当前数组中第一次出现的位置不是i, 
    //那么表示第i项是重复的,忽略掉。否则存入结果数组 
    if (array.indexOf(array[i]) == i) n.push(array[i]); 
    } 
    return n; 
    }
    console.log(unique3(arr));
    

    效果如下:

    5640239-f12b571061317019.png
    图片.png

    4.排序后相邻去除法
    虽然原生数组的”sort”方法排序结果不怎么靠谱,但在不注重顺序的去重里该缺点毫无影响。实现思路:给传入数组排序,排序后相同值相邻,然后遍历时新数组只加入不与前一值重复的值。

    var arr = [1,3,5,7,9,1,3,5];
    function unique4(array){ 
    array.sort(); 
    var re=[array[0]]; 
    for(var i = 1; i < array.length; i++){ 
    if( array[i] !== re[re.length-1]){ 
      re.push(array[i]); 
     } 
     } 
     return re; 
    }       
     console.log(unique4(arr));
    
    5640239-087ee53ddb7c9d3d.png
    图片.png

    5.优化遍历数组法
    该方法的实现代码相当酷炫,实现思路:获取没重复的最右一值放入新数组。(检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)推荐

    
    // 思路:获取没重复的最右一值放入新数组 
    var arr = [1,3,5,7,9,1,3,5];
    function unique5(array){ 
    var r = []; 
    for(var i = 0, l = array.length; i < l; i++) { 
    for(var j = i + 1; j < l; j++) 
    if (array[i] === array[j]) j = ++i; 
     r.push(array[i]); 
     } 
     return r; 
    }
     console.log(unique5(arr));
    
    

    效果如下:


    5640239-322a646ed755a873.png
    图片.png

    6.通过hash表
    思路如下:
    hash是一个对象,则存在键值对(key:value),只不过现在是为空的,所以hash[key] = value;
    1:i=0;this[i]=this[0]=1; hash[this[0]] = hash[1] , 因为hash初始为空,没有找到key=1的值,所以然后undefined,
    2:hash[1] = true(此时hash对象就有了第一组键值对),将原数组的第一个数添加到新数组中,重复第一步
    3:因为不重复的判断hash的值都是undefined,而重复的都为true了,所以不重复都被添加到新数组中
    4: 因为hash表存的值是存的地址,放在堆内存中,所以有多少个不重复的元素,就要分多少个内存来存放,所以这种方法比较占内存,但是相比之下,这种的运算运动是最快的,
    5 :这也就是用空间来换取时间了,数据量比较小,推荐用此方法

    var arr = [1,'b','b',4,3,3,4,5,1];
     
    Array.prototype.unique2 = function(){
          var hash = {}; //定义一个hash表
          var arr1 = []; //定义一个新数组
          for(var i=0;i<this.length;i++){
         
            if(! hash[this[i]]){
              hash[this[i]] = true;
              arr1.push(this[i]);
            }
          }
          return arr1;  
        }
        console.log(arr);
        console.log(arr.unique2());
    

    效果如下:

    5640239-acc0be60c65e64ad.png
    图片.png

    以上就是为大家提供的6种JS数组去重的算法实现,希望对大家的学习有所帮助。

    注意:本文原创作者祈澈姑娘,创作不易。转载请标明作者和文章的原文链接,或到微信公众号获取授权。

  • 相关阅读:
    CodeForces 706C Hard problem
    CodeForces 706A Beru-taxi
    CodeForces 706B Interesting drink
    CodeForces 706E Working routine
    CodeForces 706D Vasiliy's Multiset
    CodeForces 703B Mishka and trip
    CodeForces 703C Chris and Road
    POJ 1835 宇航员
    HDU 4907 Task schedule
    HDU 4911 Inversion
  • 原文地址:https://www.cnblogs.com/ting6/p/9725976.html
Copyright © 2011-2022 走看看