JavaScript去掉数组中的重复元素


Posted in Javascript onJanuary 13, 2011

在写程序过程中,经常会遇到去除数组中重复元素的需求。要实现这个功能其实并不难。
我们可以用一个两重循环来实现,对于小的数组,这样做当然并无不妥。
但如果我们的数组比较大,里面的元素有上万个。那么用两重循环,效率是极为低下。
下面我们就用js的特性,编写一个高效去除数组重复元素的方法。

<script> 
function unique(data){ 
data = data || []; 
var a = {}; 
for (var i=0; i<data.length; i++) { 
var v = data[i]; 
if (typeof(a[v]) == 'undefined'){ 
a[v] = 1; 
} 
}; 
data.length=0; 
for (var i in a){ 
data[data.length] = i; 
} 
return data; 
} 
function test(){ 
var arr = [9,1,3,8,7,7,6,6,5,7,8,8,7,4,3,1]; 
var arr1 = unique(arr); 
alert(arr1.join(",")); 
} 
test(); 
</script>

输出结果:
9,1,3,8,7,6,5,4
js数组去重就是把数组中重复的元素去掉:
Array.prototype.delRepeat=function(){ 
var newArray=new Array(); 
var len=this.length; 
for (var i=0;i<len ;i++){ 
for(var j=i+1;j<len;j++){ 
if(this[i]===this[j]){ 
j=++i; 
} 
} 
newArray.push(this[i]); 
} 
return newArray; 
}

但是很明显这里有for循环内嵌了另一个for循环,在大数据量下肯定非常耗时!效率低下!经过查找和高人指点优化了一个新方法:

Array.prototype.delRepeat=function(){ 
var newArray=[]; 
var provisionalTable = {}; 
for (var i = 0, item; (item= this[i]) != null; i++) { 
if (!provisionalTable[item]) { 
newArray.push(item); 
provisionalTable[item] = true; 
} 
} 
return newArray; 
}

就是使用一个临时的provisionalTable对象,将数组的值作为provisionalTable对象的键值,如果相应的值不存在就将这个数组的值push到新数组中。

效率是提高了,但是有个bug,就是假设数组中换用可转换的数字和字符串,比如数组[6,"6"]这时候就好被去掉一个。悲剧,同时求解决方法。

Javascript 相关文章推荐
[原创]图片分页查看
Aug 28 Javascript
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
Oct 25 Javascript
避免 showModalDialog 弹出新窗体的原因分析
May 31 Javascript
jquery获取input的value问题说明
Aug 19 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
Oct 08 Javascript
基于JS代码实现简单易用的倒计时 x 天 x 时 x 分 x 秒效果
Jul 13 Javascript
JS实现延迟隐藏功能的方法(类似QQ头像鼠标放上展示信息)
Dec 28 Javascript
Vue 按键修饰符处理事件的方法
May 04 Javascript
vue select选择框数据变化监听方法
Aug 24 Javascript
JavaScript实现的九种排序算法
Mar 04 Javascript
vue实现按需加载组件及异步组件功能
May 27 Javascript
Vue页面切换和a链接的本质区别详解
Nov 12 Javascript
javascript基础知识大集锦(二) 推荐收藏
Jan 13 #Javascript
javascript基础知识大集锦(一) 推荐收藏
Jan 13 #Javascript
myFocus slide3D v1.1.0 使用方法与下载
Jan 12 #Javascript
异步加载script的代码
Jan 12 #Javascript
数组方法解决JS字符串连接性能问题有争议
Jan 12 #Javascript
js对数字的格式化使用说明
Jan 12 #Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
Jan 12 #Javascript
You might like
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
2015/01/30 PHP
php常用的工具开发整理
2019/09/26 PHP
Prototype使用指南之string.js
2007/01/10 Javascript
原生javascript实现图片轮播效果代码
2010/09/03 Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
2013/01/11 Javascript
深入理解JavaScript系列(50):Function模式(下篇)
2015/03/04 Javascript
jQuery实现可关闭固定于底(顶)部的工具条菜单效果
2015/11/06 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
Bootstrap php制作动态分页标签
2016/12/23 Javascript
如何利用JQuery实现从底部回到顶部的功能
2016/12/27 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
jQuery实现的粘性滚动导航栏效果实例【附源码下载】
2017/10/19 jQuery
实时监控input框,实现输入框与下拉框联动的实例
2018/01/23 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
2020/04/20 Javascript
JS获取当前时间戳方法解析
2020/08/29 Javascript
[55:45]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第一局
2016/02/28 DOTA
[44:43]完美世界DOTA2联赛决赛日 FTD vs GXR 第一场 11.08
2020/11/11 DOTA
使用python实现tcp自动重连
2017/07/02 Python
深入浅出学习python装饰器
2017/09/29 Python
Python线程下使用锁的技巧分享
2018/09/13 Python
详解python中的index函数用法
2019/08/06 Python
python 使用opencv 把视频分割成图片示例
2019/12/12 Python
Python 绘制可视化折线图
2020/07/22 Python
加拿大鞋网:Globo Shoes
2019/12/26 全球购物
Java中实现多态的机制是什么?
2014/12/07 面试题
和平主题的演讲稿
2014/01/12 职场文书
一年级学生期末评语
2014/04/21 职场文书
民族精神月活动总结
2014/08/28 职场文书
2014年小学工作总结
2014/11/26 职场文书
2015年预算员工作总结
2015/05/14 职场文书
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python
mysql下的max_allowed_packet参数设置详解
2022/02/12 MySQL
「天才王子的赤字国家重生术」妮妮姆·拉雷粘土人开订
2022/03/21 日漫