这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
这篇文章主要介绍了 javascript 数组去重常用方法, 结合实例形式对比分析了几种常用的数组去重方法实现技巧与优缺点, 需要的朋友可以参考下
本文实例讲述了 javascript 数组去重常用方法。分享给大家供大家参考,具体如下:
数组去除重复值是面试常考内容,也是很容易用到的一个技巧,下面就几种去重的方法进行介绍。
首先是最常见的方法,也就是添加一个临时数组,将原数组遍历,加入临时数组,每次加入时判断待加入的元素是否存在于临时数组中,代码如下:
- // 对数组进行去重操作,只考虑数组中元素为数字或字符串,返回一个去重后的数组
- //第一种方法,遍历,将没有的插入临时数组
- function uniqArray1(arr) {
- var n=[];
- for(var i=0;i<arr.length;i++){
- //如果当前项已经保存到了临时数组,则跳过,否则加入
- if(n.indexOf(arr[i])==-1){
- n.push(arr[i]);
- }
- }
- return n;
- }
那么还有没有更好的办法呢?可以采用哈希表的思想,在 JavaScript 中,对象的查找比数组下标的查找要快很多倍。所以我们可以创建一个对象专门来存放已加入临时数组的元素,那么每次加入新的元素时就可以通过查找对象来判断是否重复了,代码如下:
- //第二种方法,使用哈希表
- function uniqArray2(arr){
- var n={},//哈希表
- r=[];//零时数组
- for(var i=0;i<arr.length;i++){
- if(n[arr[i]]==null){//如果哈希表中没有,则添加到哈希表,且进入临时数组
- n[arr[i]]=true;
- r.push(arr[i]);
- }
- }
- return r;
- }
还有一种方法,虽然速度没有哈希表快,但是比最基本的 indexOf 来的快,思想就是先经过排序函数 sort,再比较相邻的元素,不同的就加到临时数组中。代码如下:
- //第三种方法,先排序,再比较邻接部分
- function uniqArray3(arr){
- arr.sort();
- var r=[arr[0]];
- for(var i=1;i<arr.length;i++){
- if(arr[i]!=r[r.length-1]){//由于已经经过了排序,所以相邻的是相同的
- r.push(arr[i]);
- }
- }
- return r;
- }
最后实验代码如下:
- //验证数组去重函数的使用
- var arr=[2,3,4,2,4,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3];
- for(var i=0;i<10000000;i++){//为了分辨出花费时间的区别,特此增加数组的长度
- arr.push(3);
- }
- var time1=Date.now();
- var n1=uniqArray1(arr);
- var time2=Date.now();
- console.log(n1);//2,3,4,5说明第一种去重成功
- console.log(time2-time1);//218
- time1=Date.now();
- var n2=uniqArray2(arr);
- time2=Date.now();
- console.log(n2);//2,3,4,5说明第二种去重成功
- console.log(time2-time1);//63,说明对象下标的引用要比indexOf搜索快得多
- time1=Date.now();
- var n3=uniqArray3(arr);
- time2=Date.now();
- console.log(n3);//2,3,4,5说明第三种去重成功
- console.log(time2-time1);//203,说明sort方法使用快排,比indexOf快,但是没有哈希快
可以看到哈希算法的速度是最快的。
希望本文所述对大家 JavaScript 程序设计有所帮助。
来源: http://www.phperz.com/article/17/0708/334151.html