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

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

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

方法一:原理:利用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];
}

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

js 数组去重(7种)的更多相关文章

  1. js数组去重五种方法

    今天来聊一聊JS数组去重的一些方法,包括一些网上看到的和自己总结的,总共5种方法(ES5). 第一种:遍历数组法 这种方法最简单最直观,也最容易理解,代码如下: var arr = [2, 8, 5, ...

  2. js数组去重几种思路

    在一些后台语言中都内置了一些方法来处理数组或集合中重复的数据.但是js中并没有类似的方法,网上已经有一些方法,但是不够详细.部分代码来源于网络.个人总计如下:大致有4种思路 1)使用两次循环比较原始的 ...

  3. js数组去重的4种方法

    js数组去重,老生长谈,今天对其进行一番归纳,总结出来4种方法 贴入代码前 ,先对浏览器Array对象进行支持indexOf和forEach的polyfill Array.prototype.inde ...

  4. JS数组去重的几种常见方法

    JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ ...

  5. JS数组去重的6种算法实现

    1.遍历数组法 最简单的去重方法,实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中:注意点:判断值是否在数组的方法"indexOf"是ECMAScript5 方法 ...

  6. JS 数组去重(数组元素是对象的情况)

    js数组去重有经典的 几种方法 但当数组元素是对象时,就不能简单地比较了,需要以某种方式遍历各值再判断是否已出现. 因为: 1.如果是哈希判断法,对象作哈希表的下标,就会自动转换成字符型类型,从而导致 ...

  7. js数组去重常用方法

    js数组去重是面试中经常会碰到的问题,无论是前端还是node.js数组常见的有两种形式,一种是数组各元素均为基本数据类型,常见的为数组字符串格式,形如['a','b','c'];一种是数组各元素不定, ...

  8. js数组去重的方法(转)

    JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ ...

  9. js 数组去重求和 (转载)

    方法一:js数组id去重,value值相加问题 来源:https://www.jianshu.com/p/8f79e31b46ed // js let arr = [ { id: 1, value: ...

随机推荐

  1. MongoDB 搭建分片集群

    在MongoDB(版本 3.2.9)中,分片是指将collection分散存储到不同的Server中,每个Server只存储collection的一部分,服务分片的所有服务器组成分片集群.分片集群(S ...

  2. Over:窗口函数(滑动聚合)

    Over 窗口函数在Select 子句中,对查询的结果集进行“滑动-聚合”运算:如果使用count,那么基于滑动窗口的聚合语义同 base+1 累加:如果使用sum,那么基于滑动窗口的聚合语义等同于数 ...

  3. ExtJs4 基础必备

    认识ExtJs的开发包 下载路径:http://www.sencha.com/products/extjs/download/ 解压有20多兆,别怕,真正运行的没这么大.认识下这个包的文件结构吧. b ...

  4. 【Win 10 应用开发】打印UI元素

    Windows App支持将UI界面进行打印的功能,这与浏览器中的打印网页的用途相近,其好处就是“所见即所得”,直接把界面上呈现的内容打印下来,比重新创建打印图像方便得多. 要在通用App中实现打印, ...

  5. JavaScript:声明变量名的语法规则

    一.语法规则 1.变量必须使用字母.下划线(_)或者美元符($)开始. 2.然后可以使用任意多个英文字母.数字.下划线(_)或者美元符($)组成. 3.不能使用JS关键词与保留字. 二.示例 var ...

  6. iOS开发之窥探UICollectionViewController(一) -- Ready Your CollectionViewController

    之前用CollectionViewController只是皮毛,一些iOS从入门到精通的书上也是泛泛而谈.这几天好好的搞了搞苹果的开发文档上CollectionViewController的内容,亲身 ...

  7. C算法编程题(六)串的处理

    前言 上一篇<C算法编程题(五)“E”的变换> 连续写了几篇有关图形输出的编程题,今天说下有关字符串的处理. 程序描述 在实际的开发工作中,对字符串的处理是最常见的编程任务.本题目即是要求 ...

  8. 【jQuery小实例】js 插件 查看图片

    ---本系列文章所用使用js均可在本博客文件中找到. 像淘宝一样,鼠标放在某一件商品上,展示大图信息,甚至查看图片的具体部位.给人超炫的效果,这种效果实现基于js文件和js插件.大致可以分为三步,添加 ...

  9. Opencv摄像头实时人脸识别

    Introduction 网上存在很多人脸识别的文章,这篇文章是我的一个作业,重在通过摄像头实时采集人脸信息,进行人脸检测和人脸识别,并将识别结果显示在左上角. 利用 OpenCV 实现一个实时的人脸 ...

  10. Oracle 11gR2 RAC修改监听默认端口

    一.修改SCAN listener port 1.1 修改SCAN listener port 1.2 重启SCAN listener生效新端口 1.3 确认更改 二.修改Listener Ports ...