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

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

  • 相关阅读:
    第五章.函数
    第四章.文件操作
    第三章.数据类型
    PyYaml简单学习
    Vim编辑器基本用法
    numpy.ndarray.transpose用法理解
    Django Formsets总结
    学习,认知,思维
    Django model总结(上)
    结合pandas,sqlite3批量将csv数据导入sqlite数据库
  • 原文地址:https://www.cnblogs.com/zhangxiaos/p/6150049.html
Copyright © 2011-2022 走看看