js数组去重的5种算法实现


Posted in Javascript onNovember 04, 2015

1.遍历数组法
最简单的去重方法,实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中;注意点:判断值是否在数组的方法“indexOf”是ECMAScript5 方法,IE8以下不支持,需多写一些兼容低版本浏览器代码,源码如下:

// 最简单数组去重法 
function unique1(array){ 
var n = []; //一个新的临时数组 
//遍历当前数组 
for(var i = 0; i < array.length; i++){ 
//如果当前数组的第i已经保存进了临时数组,那么跳过, 
//否则把当前项push到临时数组里面 
if (n.indexOf(array[i]) == -1) n.push(array[i]); 
} 
return n; 
}

2.对象键值对法
该方法执行的速度比其他任何方法都快, 就是占用的内存大一些,实现思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,不是的话给对象新增该键并放入新数组。注意 点: 判断是否为js对象键时,会自动对传入的键执行“toString()”,不同的键可能会被误认为一样;例如: a[1]、a["1"] 。解决上述问题还是得调用“indexOf”。

// 速度最快, 占空间最多(空间换时间) 
function unique2(array){ 
var n = {}, r = [], len = array.length, val, type; 
for (var i = 0; i < array.length; i++) { 
val = array[i]; 
type = typeof val; 
if (!n[val]) { 
n[val] = [type]; 
r.push(val); 
} else if (n[val].indexOf(type) < 0) { 
n[val].push(type); 
r.push(val); 
} 
} 
return r; 
}

3.数组下标判断法
还是得调用“indexOf”性能跟方法1差不多,实现思路:如果当前数组的第i项在当前数组中第一次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入结果数组。

function unique3(array){ 
var n = [array[0]]; //结果数组 
//从第二项开始遍历 
for(var i = 1; i < array.length; i++) { 
//如果当前数组的第i项在当前数组中第一次出现的位置不是i, 
//那么表示第i项是重复的,忽略掉。否则存入结果数组 
if (array.indexOf(array[i]) == i) n.push(array[i]); 
} 
return n; 
}

4.排序后相邻去除法
虽然原生数组的”sort”方法排序结果不怎么靠谱,但在不注重顺序的去重里该缺点毫无影响。实现思路:给传入数组排序,排序后相同值相邻,然后遍历时新数组只加入不与前一值重复的值。

// 将相同的值相邻,然后遍历去除重复值 
function unique4(array){ 
array.sort(); 
var re=[array[0]]; 
for(var i = 1; i < array.length; i++){ 
if( array[i] !== re[re.length-1]){ 
  re.push(array[i]); 
 } 
 } 
 return re; 
}

5.优化遍历数组法
该方法的实现代码相当酷炫,实现思路:获取没重复的最右一值放入新数组。(检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)推荐

// 思路:获取没重复的最右一值放入新数组 
function unique5(array){ 
var r = []; 
for(var i = 0, l = array.length; i < l; i++) { 
 for(var j = i + 1; j < l; j++) 
  if (array[i] === array[j]) j = ++i; 
 r.push(array[i]); 
 } 
 return r; 
}

判断浏览器是否支持indexOf ,indexOf 为ecmaScript5新方法 IE8以下(包括IE8, IE8只支持部分ecma5)不支持

if (!Array.prototype.indexOf){ 
// 新增indexOf方法 
Array.prototype.indexOf = function(item){ 
var result = -1, a_item = null; 
if (this.length == 0){ 
return result; 
} 
for(var i = 0, len = this.length; i < len; i++){ 
a_item = this[i]; 
if (a_item === item){ 
result = i; 
break; 
} 
} 
return result; 
} 
}

以上就是为大家提供的5种JS数组去重的算法实现,希望对大家的学习有所帮助。
 

Javascript 相关文章推荐
Jquery 一次处理多个ajax请求的代码
Sep 02 Javascript
js获取字符串字节数方法小结
Jun 09 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
May 19 Javascript
如何在Angular.JS中接收并下载PDF
Nov 26 Javascript
javascript设计模式之中介者模式学习笔记
Feb 15 Javascript
bootstrap模态框远程示例代码分享
May 22 Javascript
js纯前端实现腾讯cos文件上传功能的示例代码
May 14 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
Sep 10 Javascript
vue data变量相互赋值后被实时同步的解决步骤
Aug 05 Javascript
Vue看了就会的8个小技巧
Jan 21 Vue.js
关于element的表单组件整理笔记
Feb 05 Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
Jun 02 Javascript
解决js图片加载时出现404的问题
Nov 30 #Javascript
jquery实现的点击翻书效果代码
Nov 04 #Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
Nov 04 #Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
Nov 04 #Javascript
JS实现网页上随滚动条滚动的层效果代码
Nov 04 #Javascript
jQuery实现带有动画效果的回到顶部和底部代码
Nov 04 #Javascript
JavaScript前端开发之实现二进制读写操作
Nov 04 #Javascript
You might like
PHP中HTTP方式下的Gzip压缩传输方法举偶
2007/02/15 PHP
PHP中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
php arsort 数组降序排序详细介绍
2016/11/17 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
总结AJAX相关JS代码片段和浏览器模型
2007/08/15 Javascript
JavaScript 序列化对象实现代码
2009/12/18 Javascript
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
2012/05/23 Javascript
JS获取节点的兄弟,父级,子级元素的方法
2014/01/09 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
2016/10/26 Javascript
jqgrid实现简单的单行编辑功能
2017/09/30 Javascript
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
Vue.directive使用注意(小结)
2018/08/31 Javascript
详解js中Array的方法及技巧
2018/09/12 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
2019/09/18 Javascript
vue+layui实现select动态加载后台数据的例子
2019/09/20 Javascript
详解JavaScript 异步编程
2020/07/13 Javascript
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
使用python编写android截屏脚本双击运行即可
2014/07/21 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
python微信跳一跳系列之色块轮廓定位棋盘
2018/02/26 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
2020/11/01 Python
美国咖啡批发网站:Coffee.org
2017/06/29 全球购物
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
师范生自我鉴定
2014/03/20 职场文书
党的群众路线教育实践活动个人整改措施落实情况
2014/11/04 职场文书
大学军训通讯稿
2015/07/18 职场文书
PHP实现rar解压读取扩展包小结
2021/06/03 PHP
python基于turtle绘制几何图形
2021/06/15 Python
使用goaccess分析nginx日志的详细方法
2021/07/09 Servers
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android
使用refresh_token实现无感刷新页面
2022/04/26 Javascript