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 相关文章推荐
浅谈EasyUI中Treegrid节点的删除
Mar 01 Javascript
JavaScript 动态加载脚本和样式的方法
Apr 13 Javascript
在JavaScript中处理数组之reverse()方法的使用
Jun 09 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
Aug 11 Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
Aug 06 Javascript
20行JS代码实现粘贴板复制功能
Feb 06 Javascript
收集前端面试题之url、href、src
Mar 22 Javascript
jQuery中可见性过滤器简单用法示例
Mar 31 jQuery
详解react阻止无效重渲染的多种方式
Dec 11 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
Apr 17 Javascript
详解wepy开发小程序踩过的坑(小结)
May 22 Javascript
详解Vue Cli浏览器兼容性实践
Jun 08 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
使用Sphinx对索引进行搜索
2013/06/25 PHP
实测在class的function中include的文件中非php的global全局环境
2013/07/15 PHP
php中json_encode UTF-8中文乱码的更好解决方法
2014/09/28 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
2014/12/01 PHP
你应该知道PHP浮点数知识
2015/05/13 PHP
php编写批量生成不重复的卡号密码代码
2015/05/14 PHP
浅谈PHP中静态方法和非静态方法的相互调用
2016/10/04 PHP
jquery 常用操作方法
2010/01/28 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
2012/09/26 Javascript
nullJavascript中创建对象的五种方法实例
2013/05/07 Javascript
jquery append 动态添加的元素事件on 不起作用的解决方案
2015/07/30 Javascript
Angularjs中UI Router的使用方法
2016/05/14 Javascript
微信小程序教程之本地图片上传(leancloud)实例详解
2016/11/16 Javascript
vue-cli3 配置开发与测试环境详解
2019/05/17 Javascript
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
基于python的七种经典排序算法(推荐)
2016/12/08 Python
Python实现的破解字符串找茬游戏算法示例
2017/09/25 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
2019/08/15 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
python读写文件write和flush的实现方式
2020/02/21 Python
深入了解python列表(LIST)
2020/06/08 Python
深入分析python 排序
2020/08/24 Python
如何在Anaconda中打开python自带idle
2020/09/21 Python
俄罗斯旅游网站:Tripadvisor俄罗斯
2017/03/21 全球购物
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
生产内勤岗位职责
2013/12/07 职场文书
办公室主任先进事迹
2014/01/18 职场文书
庆七一活动方案
2014/01/25 职场文书
刘胡兰的英雄事迹材料
2014/02/11 职场文书
资金主管岗位职责范本
2014/03/04 职场文书
成品库仓管员岗位职责
2014/04/06 职场文书
小学生勤俭节约演讲稿
2014/08/28 职场文书
我收到了德劲DE1107
2022/04/05 无线电
《火纹风花雪月无双》预告“神秘雇佣兵” 紫发剑客
2022/04/13 其他游戏
mysql幻读详解实例以及解决办法
2022/06/16 MySQL