zoukankan      html  css  js  c++  java
  • js 数组去重(7种)

      第一次写技术博客,之前总是认为写这些会很浪费时间,还不如多看几篇技术博文。但。。。但昨天不知道受了什么刺激,好像有什么在驱使着自己要写一样,所以才有了今天的第一篇博文。总觉得应该要坚持这样写下去。初次写,并不知道写些什么,就慢慢地整理些以往的总结吧!

      文中如果有哪里写得不准确或者有任何建议的,欢迎毫不吝啬地指出!

      现在,我们就切入主题吧!哈哈~~ 下面是我整理的目前想到的几种数据去重方法:

    方法一:原理:利用indexOf()遍历数组,如果临时数组找不到该元素,则push到临时数组,否则不做处理

    function uniqArr1(arr) {
      var res = [];
    
      for (var i = 0,len = arr.length; i < len; i++) {
            if (res.indexOf(arr[i]) == -1) {
              res.push(arr[i]);
            }
          }
    
          return res;
        }
    }

    方法二:原理:同样利用indexOf()遍历数组,如果元素首次出现位置和它的索引相等,则说明不是重复元素,push到临时数组,否则不做处理

    function uniqArr2(arr) {
      var res = [arr[0]];
    
      for (var i = 1,len = arr.length; i < len; i++) {
        if (arr.indexOf(arr[i]) == i) {
          res.push(arr[i]);
        }
      }
    
      return res;
    }

    方法三:原理:利用对象键值唯一性,如果对象没有该属性,则添加该属性,同时将该元素push到临时数组

    function uniqArr3(arr) {
      var obj = {},
      res = [];
    
      for (var i = 1,len = arr.length; i < len; i++) {
        if (!obj[arr[i]]) {
          obj[arr[i]] = true;
          res.push(arr[i]);
        }
      }
    
      return res;
    }

    方法四:原理:同样利用对象键值唯一性,唯一不同的地方是这里不再使用临时数组变量,而是利用Object.keys()方法将去重后的结果返回

    注意:这里的返回结果跟上述几种不太一致,原因是这里是对象的key,每一项都是字符串的形式,同时返回的结果数组元素的顺序是不确定的

    function uniqArr4(arr) {
      var obj = {};
    
      for (var i = 1,len = arr.length; i < len; i++) {
        if (!obj[arr[i]]) {
          obj[arr[i]] = true;
        }
      }
      
      return Object.keys(obj);
    }

    方法五:原理:先对原数组进行排序,临时数组先存储第一个元素,然后从第二个元素开始循环判断排序后的原数组(arr)是否与临时数组(res)的第length-1个元素(即res的最后一个元素,也即res每次新添加的元素)是否相等,若不相等,则push到res,这样就确保了每次push到res中的都是不重复的。

    注意:这里返回的结果数组同样顺序是有变化的(方法四顺序也有变化)

    function uniqArr5(arr) {
      arr.sort();
      var res = [arr[0]];
    
      for (var i = 1,len = arr.length; i < len; i++) {
        if (arr[i] !== res[res.length -1]) {
          res.push(arr[i]);
        }
      }
    
      return res;
    }

    方法六:原理:嵌套循环,如果相等,则截掉后面的,这里要注意splice会影响到原数组,所以这里重新计算了len值和j值。

    function uniqArr6(arr) {
      var len = arr.length;
    
      for (var i = 0; i < len; i++) {
        for (var j = i + 1; j < len; j++) {
          if (arr[i] === arr[j]) {
            arr.splice(j, 1);
            len = arr.length;
            j--;
          }
        }
      }
    
      return arr;
    }

    方法七:原理:ES6新的数据结构set,类似数组,但成员的值都是唯一的,所以利用这个特性可以做到数组去重

    function uniqArr7(arr) {
      var res = new Set(arr);
      return [...res];
    }

    暂且先分析了几种去重方法的实现原理,关于上述几种去重方法的性能分析后面将进行补充。。。 

  • 相关阅读:
    SharePoint 2010 User Profile Sync Service自动停止
    如何区别多个svchost.exe?
    Log Parser分析IIS log的一个简单例子
    Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
    Windows中右键点击文件夹, 结果找不到共享选项卡, 怎么办?
    介绍SOS中的SaveModule命令
    SharePoint中Draft版本的文档不会收到document added的Alert Email
    和我一起学Windows Workflow Foundation(1)创建和调试一个WF实例
    门户网站
    C#基础—— check、lock、using语句归纳
  • 原文地址:https://www.cnblogs.com/zhangxiaos/p/6150049.html
Copyright © 2011-2022 走看看