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

      之前一段时间一直在准备面试, 因而博客太久没更新; 现在基本知识点都复习完毕, 接下来就分享下 面试的一些常见问题:

    去正规的互联网公司笔试、面试有很大的概率会碰到 使用javascript实现数组去重 的编码问题:

    如:魅族笔试题

      本博文就 js 如何实现数组去重整理出5种方法,并附上演示Demo 以及 源码。

     1.遍历数组法

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

    // 最简单数组去重法
    function unique1(array){
      var n = []; //一个新的临时数组
      //遍历当前数组
      for(var i = 0; i < array.length; i++){
        //如果当前数组的第i已经保存进了临时数组,那么跳过,
        //否则把当前项push到临时数组里面
        if (n.indexOf(array[i]) == -1) n.push(array[i]);
      }
      return n;
    }
    // 判断浏览器是否支持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;
      }
    }

     

    2.对象键值对法

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

    // 速度最快, 占空间最多(空间换时间)
    function unique2(array){
      var n = {}, r = [], len = array.length, val, type;
        for (var i = 0; i < array.length; i++) {
            val = array[i];
            type = typeof val;
            if (!n[val]) {
                n[val] = [type];
                r.push(val);
            } else if (n[val].indexOf(type) < 0) {
                n[val].push(type);
                r.push(val);
            }
        }
        return r;
    }

     

    3. 

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

    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;
    }

    4. 

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

    // 将相同的值相邻,然后遍历去除重复值
    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;
    }

    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;
    }

    demo 源码

    参考资料:

    Fast Algorithm To Find Unique Items in JavaScript Array

  • 相关阅读:
    Entity Framework Core 2.0 新特性
    asp.net core部署时自定义监听端口,提高部署的灵活性
    asp.net core使用jexus部署在linux无法正确 获取远程ip的解决办法
    使用xshell连接服务器,数字键盘无法使用解决办法
    使用Jexus 5.8.2在Centos下部署运行Asp.net core
    【DevOps】DevOps成功的八大炫酷工具
    【Network】Calico, Flannel, Weave and Docker Overlay Network 各种网络模型之间的区别
    【Network】UDP 大包怎么发? MTU怎么设置?
    【Network】高性能 UDP 应该怎么做?
    【Network】golang 容器项目 flannel/UDP相关资料
  • 原文地址:https://www.cnblogs.com/wteam-xq/p/4732351.html
Copyright © 2011-2022 走看看