前言

去重是开发中经常会碰到的一个热点问题,不过目前项目中碰到的情况都是后台接口使用SQL去重,简单高效,基本不会让前端处理去重。

那么前端处理去重会出现什么情况呢?假如每页显示10条不同的数据,如果数据重复比较严重,那么要显示10条数据,可能需要发送多个http请求才能够筛选出10条不同的数据,而如果在后台就去重了的话,只需一次http请求就能够获取到10条不同的数据。

当然,这并不是说前端去重就没有必要了,依然需要会熟练使用。本文主要介绍几种常见的数组去重的方法。

方法实现

双循环去重

双重for(或while)循环是比较笨拙的方法,它实现的原理很简单:先定义一个包含原始数组第一个元素的数组,然后遍历原始数组,将原始数组中的每个元素与新数组中的每个元素进行比对,如果不重复则添加到新数组中,最后返回新数组;因为它的时间复杂度是O(n^2),如果数组长度很大,那么将会非常耗费内存

function unique(arr) {if (!Array.isArray(arr)) {console.log('type error!')return}let res = [arr[0]]for (let i = 1; i < arr.length; i++) {let flag = truefor (let j = 0; j < res.length; j++) {if (arr[i] === res[j]) {flag = false;break}}if (flag) {res.push(arr[i])}}return res
}

indexOf方法去重1

数组的indexOf()方法可返回某个指定的元素在数组中首次出现的位置。该方法首先定义一个空数组res,然后调用indexOf方法对原来的数组进行遍历判断,如果元素不在res中,则将其push进res中,最后将res返回即可获得去重的数组

function unique(arr) {if (!Array.isArray(arr)) {console.log('type error!')return}let res = []for (let i = 0; i < arr.length; i++) {if (res.indexOf(arr[i]) === -1) {res.push(arr[i])}}return res
}

indexOf方法去重2

利用indexOf检测元素在数组中第一次出现的位置是否和元素现在的位置相等,如果不等则说明该元素是重复元素

function unique(arr) {if (!Array.isArray(arr)) {console.log('type error!')return}return Array.prototype.filter.call(arr, function(item, index){return arr.indexOf(item) === index;});
}

相邻元素去重

这种方法首先调用了数组的排序方法sort(),然后根据排序后的结果进行遍历及相邻元素比对,如果相等则跳过改元素,直到遍历结束

function unique(arr) {if (!Array.isArray(arr)) {console.log('type error!')return}arr = arr.sort()let res = []for (let i = 0; i < arr.length; i++) {if (arr[i] !== arr[i-1]) {res.push(arr[i])}}return res
}

利用对象属性去重

创建空对象,遍历数组,将数组中的值设为对象的属性,并给该属性赋初始值1,每出现一次,对应的属性值增加1,这样,属性值对应的就是该元素出现的次数了

function unique(arr) {if (!Array.isArray(arr)) {console.log('type error!')return}let res = [],obj = {}for (let i = 0; i < arr.length; i++) {if (!obj[arr[i]]) {res.push(arr[i])obj[arr[i]] = 1} else {obj[arr[i]]++}}return res
}

set与解构赋值去重

ES6中新增了数据类型set,set的一个最大的特点就是数据不重复。Set函数可以接受一个数组(或类数组对象)作为参数来初始化,利用该特性也能做到给数组去重

function unique(arr) {if (!Array.isArray(arr)) {console.log('type error!')return}return [...new Set(arr)]
}

Array.from与set去重

Array.from方法可以将Set结构转换为数组结果,而我们知道set结果是不重复的数据集,因此能够达到去重的目的

function unique(arr) {if (!Array.isArray(arr)) {console.log('type error!')return}return Array.from(new Set(arr))
}

总结

数组去重是开发中经常会碰到的一个热点问题。我们可以根据不同的应用场景来选择不同的实现方式。

7种方法实现数组去重相关推荐

  1. html怎么创建数组,js创建数组的三种方法 JS数组去重的几种常见方法

    JS数组有哪几种定义方式? js 里创建一个数组 那几种方式有什么区别吗?a = new Array(); b = []; 性能问题吗?? function clear(arr) { // 1 如何获 ...

  2. ES6使用Set方法进行数组去重

    在ES6中可以使用Set方法进行数组去重: let arr = [1,1,1,2,2,3,3,3,4,4]let set = new Set(arr)console.log(set); 输出结果:Se ...

  3. python 列表去重(数组)的几种方法_python 列表去重(数组)的几种方法

    在抓取页面图片时,为避免重复抓取,将抓取的img结果(结果集是list类型的)通过集合去重.这里总结了下网上搜集到的几种方法. 一.方法1 代码如下 复制代码 ids = [1,2,3,3,4,2,3 ...

  4. es6 数组去重_JS数组去重的9种方法(包括去重NaN和复杂数组类型)

    其实网上已经有很多js数组的去重方法,但是我看了很多篇并自己通过代码验证,发现都有一些缺陷,于是在研究多篇代码之后,自己总结了9种方法,如果有哪里不对请及时纠正我哈~ 测试代码 let arr1 = ...

  5. 数组中某个元素相同的去重_几种去除数组中重复元素的方法、数组去重

    工作中遇到的一个问题,就是去除数组中重复的元素,记录一下几种有效的方法: 第一种思路:遍历要删除的数组arr, 把元素分别放入另一个数组tmp中,在判断该元素在arr中不存在才允许放入tmp中. 去除 ...

  6. python 列表去重(数组)的几种方法_python 列表去重(数组)的几种方法(转)

    Build 2015 Beijing &amp; Windows 10 China Geek Challenge 6月5日,借着Build 2015在北京召开分会的东风,参加了这次由微软中国举 ...

  7. javascript小实例,多种方法实现数组去重问题

    废话不多说,直接拿干货! 先说说这个实例的要求:写一个方法实现数组的去重.(要求:执行方法,传递一个数组,返回去重后的新数组,原数组不变,实现过程中只能用一层循环,双层嵌套循环也可写,只做参考): 先 ...

  8. 在php中可以使用几种方法定义数组,PHP中数组定义的几种方法

    在php.html" target="_blank">php和其他编程语言中,需要常常使用数组创建,我们在前端开发中,js的数组创建可以由new array创建,下 ...

  9. JAVA数组扁平化整合_5种方法实现数组扁平化

    数组扁平化概念 数组扁平化是指将一个多维数组变为一维数组 [1, [2, 3, [4, 5]]] ------> [1, 2, 3, 4, 5] 复制代码 实现 1. reduce 遍历数组每一 ...

最新文章

  1. 磁珠 磁环 双向二极管 TVS二极管
  2. STL中基本容器有: string、vector、list、deque、set、map
  3. 电子科技大学通信原理视频教程 瓦特芯收藏
  4. 云计算自动化对于虚拟化环境意味着什么?
  5. wdatepicker设置时间范围_Parker590+在直流电机控制系统中的应用、设置及常见故障排除(中)...
  6. vscode较详细注释的汇编语言hello world 输出程序,第一个汇编程序
  7. java hibernate的使用_《Hibernate快速开始 – 4 – 使用JAVA持久层 API (JPA)教程》
  8. r语言 分类变量 虚拟变量_R语言中的变量
  9. sql游标以及异常处理
  10. 用火车头采集小游戏网站教程[转载]
  11. thinkphp js带参数跳转页面
  12. 【图说Word】怎么在word的每一行前面和后面加上同一个字或字符?
  13. Memento 备忘录 快照模式 MD
  14. Linux安装virgo
  15. MT4指标安装方法,以MACD红绿柱黄白线双线macd为例
  16. oppok3如何刷机_oppok3刷机方法
  17. docker学习-狂神视频
  18. Android 程序随开机自动运行
  19. 飞鹅云打印机api接口asp版,asp源码对接飞鹅云小票打印机
  20. 小工程结算书范本_工程结算书范本

热门文章

  1. 永中科技剥离台资百慕大是”执政败笔“
  2. 青岛新媒体运营教程:短视频没脚本怎么行,镜头脚本模板直接套用
  3. keil中c语言bit怎么用,关于keil多c文件工程中bit变量的声明定义问题
  4. Java多线程入门(狂神说)
  5. jQuery实现拼图小游戏(实操案例)
  6. 从零开始在 FreeNAS 的 Jail 上安装 NextCloud 并配置 Nginx 作为网页服务器而且 设置SSL证书 使用 https 访问 以及 oc_filecache 修复方法、优化方法
  7. C++进阶学习(二)----C到C++II
  8. 中国重大铁路事故一览,90年代以前基本都是爆炸事故,90年代以后基本都是追尾事故...
  9. 青春无言│用技术定格毕业季最美好的回忆
  10. P5431 【模板】乘法逆元2