数组去重的几种实现方法
2018-07-09 13:47:24来源:博客园 阅读 ()
1. 使用Set
ES6 提供了新的数据结构Set, 它类似数组,和C++中的set容器一样,它成员的值都是唯一的,没有重复的值;Set本身是一个构造函数,用来生成Set数据结构。
var s = new Set(); s.add("hello").add("goodbye").add("hello"); s.size === 2; s.has("hello") === true;
const s = new Set(); [2,3,5,4,5,2,2].forEach(x => s.add(x)); for(let i of s) { console.log(i); } // 2 3 5 4
还有更简单的方式
function dedupe(array) { return Array.from(new Set(array)); } dedupe([1, 1, 2, 3]);//[1, 2, 3]
上面这种方式在于Array.from方法可以将Set结构转化为数组。如果你还觉得不过瘾,那么还有一种表示方式:将扩展运算符(...)与Set结构相结合,就可以去除数组的重复成员;扩展运算符内部使用for...of循环。
[...new Set(array)]
2. indexOf的方法
这种方法新建一个存储数组,遍历参数数组,如果新数组中没找到该元素的索引,则把该元素push进新数组。
function dedupe(array) { var newArr = []; for(var i=0; i<array.length; i++) { if(newArr.indexOf(array[i]) == -1) { newArr.push(array[i]); } } return newArr; } var arr = [1, 1, 2, 2, 3, 3]; console.log(dedupe(arr));//[1, 2, 3]
3. 比较数组下标
我们知道,通过比较数组下标可以从数组中找到重复的数字,那么自然可以根据数组成员第一次时的索引值i进行判断,该方法类似indexOf的方法。
function dedupe(array) { var newArr = []; for(var i=0; i<array.length; i++) { if(array.indexOf(array[i]) == i) { newArr.push(array[i]); } } return newArr; } var arr = [1, 1, 2, 2, 3, 3]; console.log(dedupe(arr));//[1, 2, 3]
4. 对象查找
function dedupe(arr) { var res = []; var o = Object.create(null); for(let v of arr) { var type = typeof v; if(!o[v]) { res.push(v); o[v] = [type]; }else if(o[v].indexOf(type) == -1) { o[v].push(type); res.push(v); } } return res; } var arr = [1, 2, '2', 4, 7, 'a', 'a', 2, 3, 7, 6, 7]; console.log(dedupe(arr));//[1, 2, '2', 4, 7, 'a', 3, 6]
5. 排序相邻去重
function dedupe(arr) { arr.sort(); var newArr = [arr[0]]; for(var i=1; i<arr.length; i++) { if(arr[i] !== newArr[newArr.length-1]) { newArr.push(arr[i]); } } return newArr; } var arr = [1, 2, '2', 4, 7, 'a', 'a', 2, 3, 7, 6, 7]; console.log(dedupe(arr));//[1, "2", 2, 3, 4, 6, 7, "a"]
6. 数组实例的includes方法
function dedupe(arr) { var res=[]; for(let v of arr) { if(!res.includes(v)) { res.push(v); } } return res; } var arr = [1, 2, '2', 4, 7, 'a', 'a', 2, 3, 7, 6, 7]; console.log(dedupe(arr));//[1, 2, "2", 4, 7, "a", 3, 6]
7. 暴力去重
function dedupe(arr) { arr.sort(); console.log(arr); for(var i=1; i<arr.length; i++) { if(arr[i]===arr[i-1]) { arr.splice(i, 1); i--; } } return arr; } var arr = [1, 2, '2', 4, 2, 7, 'a', 'a', 2, 3, 7, 6, 7, 7, 7]; console.log(dedupe(arr)); //[1, "2", 2, 2, 2, 3, 4, 6, 7, 7, 7, 7, 7, "a", "a"] //[1, "2", 2, 3, 4, 6, 7, "a"] var arr0 = [5, 1, 2, '2', 4, '2', 2, 5, 7, 'a', 'a', 2, 3, '7', 6, '7', 7, 7]; console.log(dedupe(arr)); //[1, 2, "2", "2", 2, 2, 3, 4, 5, 5, 6, 7, 7, "7", 7, "7", "a", "a"] //[1, 2, "2", 2, 3, 4, 5, 6, 7, "7", 7, "7", "a"]
上面这种方式最好只用在数字数组或字符串数组去重,由于sort()排序方式的原因,再加上只比较相邻元素是否相等,当出现如arr0类似数组时,去重将会出现遗漏;因此最好对单一类型数组进行去重;
参考:
http://es6.ruanyifeng.com/#docs/set-map
http://es6.ruanyifeng.com/#docs/array
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:Javascript中的内存泄漏
- JS简单去除数组中重复项的方法 2020-03-16
- 使用JS在浏览器中判断当前网络连接状态的几种方法 2020-03-12
- 关于JS array的数组 2020-03-08
- javascript过滤数组重复元素的实现方法 2020-03-05
- js调用刷新界面的几种方式 2020-03-05
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash