zoukankan      html  css  js  c++  java
  • js实现数组去重

    数组去重是笔试及面试时的重要考题,现对已有方法进行如下总结:

    (1)思路:新建一个空的数组newArr,将需要去重的数组中的第一个元素传入,依次与原数组中剩余的元素进行比较,不重复则把元素传入到新数组newArr中。

          这种方法实现思路简单,由于使用‘===’,可以实现对类似2和‘2’这种数字与字符串的比较。但是该算法创建了新的数组,并且使用双层循环,对时间和空间均存在一定的浪费。

     1 Array.prototype.unique1 = function(){
     2   var newArr = [this[0]];
     3   //flag用来比较数组是否重复,不重复为true,重复为false
     4   var flag = true;
     5   for(var i = 1;i < this.length;i++){
     6       for(var j = 0; j < newArr.length; j++){
     7          if(newArr[j] === this[i]){
     8             flag = false;
     9             break;
    10          }else{
    11             flag = true;
    12          }
    13       }
    14       if(flag){
    15           newArr.push(this[i]);
    16       }
    17   }
    18 }
    19 
    20 var arr=[1,2,2,'2',3,4,4,'a','a','b'];
    21 console.log(arr.unique1());

    (2)思路:将原数组进行排序,排序之后的数组相同的元素是相邻的。新建一个数组newArr并存入原数组经过排序之后的第一个元素,遍历排序后的数组,将数组中的各个元素与newArr中的最后一个元素对比,如果二者不相等则存入newArr中。

          这种方法实现思路简单相对第一种方法减少了一层循环,但由于原数据是经过排序的,如果要求不改变原数组元素的位置,该方法就不再适用。

    Array.prototype.unique2 = function(){
        this.sort();
        var newArr = [this[0]];
        for(var i = 1; i < this.length; i++){
          if(this[i] !== newArr[newArr.length - 1]){
              newArr.push(this[i]);
          }
       }
       return newArr;
    }

    (3)思路:利用对象的相关特性,对象的组成方式为obj{'key','value'},对象中key值不可以重复,但是value值不要求。新建一个空的数组newArr,一个空的对象,遍历需要去重的数组,利用对象key不能重复的特性实现数组去重。

          该方法独辟蹊径,推荐使用,但存在的问题是最终得到的结果均为字符串类型。

    Array.prototype.unique3 = function(){
        var obj = {};
        var newArr = [];
        for(var i = 0,j = this.length;i < j; i++){
            //将原数组做为obj的key值,value值均为空。由于key值具有唯一性,因此key值重复时,key保持不变,value进行覆盖
            obj[this[i]] = " ";
        }
        for(var items in obj){
           newArr.push(items);
       }
    return newArr; }

    利用以下代码,可以达到数组去重并且保证了数据类型不变,字符串类型的“数字”和真正的数字区分

    Array.prototype.unique3 = function(){
      var obj = {},newArr = [];
      for(var i = this.length - 1;i >= 0; i--){
        if(obj[this[i]] == undefined || obj[this[i]] !== this[i]){
          obj[this[i]] = this[i];
          newArr.push(this[i]);
        }
      }
      return newArr.reverse();
    }

    (4) 思路:利用正则表达式

    Array.prototype.unique4 = function(){
        return this.join(,).match(/([^,]+)(?!.*\1)/ig);
    }

    (5)思路:与1类似,从原数组最后一个元素开始比较,因此最终数组需要反转。统一来说,采用多重循环程序效率都不高;因此推荐使用对象前去重或利用正则表达式。

    Array.prototype.unique5 = function(){
        var newArr = [];
        var flag = true;
        var i = this.length;
        var j = 0;
        newArr[0] = this[i-1];
        while(--i >= 0){
            j = newArr.length;
           while(--j >= 0){
               flag = newArr[j] != this[i];
               if(!flag)
                   break;
            } 
             flag && newArr.push(this[i]);
        }
        return newArr.reverse();
    }
  • 相关阅读:
    3、面向对象
    今日记事
    javascript 学习javascript高级程序设计
    数据库操作语言分类
    project遇到问题了。
    CentOS设置程序开机自启动的方法
    ECMAScript 基础 [完]
    CentOS 网络设置修改
    Spring Boot项目Circular view path问题解决
    数据库设计
  • 原文地址:https://www.cnblogs.com/lilacmemo/p/8507771.html
Copyright © 2011-2022 走看看