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

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

  • 相关阅读:
    vue使用elementui合并table
    使用layui框架导出table表为excel
    vue使用elementui框架,导出table表格为excel格式
    前台传数据给后台的几种方式
    uni.app图片同比例缩放
    我的博客
    【C语言】取16进制的每一位
    SharePoint Solution 是如何部署的呢 ???
    无效的数据被用来用作更新列表项 Invalid data has been used to update the list item. The field you are trying to update may be read only.
    SharePoint 判断用户在文件夹上是否有权限的方法
  • 原文地址:https://www.cnblogs.com/zhangxiaos/p/6150049.html
Copyright © 2011-2022 走看看