JavaScript数组去重的3种方法和代码实例


Posted in Javascript onJuly 01, 2015

数组去重的方法有很多,到底哪种是最理想的,自己不清楚。于是自己测试了下数组去重的效果和性能。测试十万个数据,代码和所耗大概时间如下。

到底采用哪种方法,根据实际情况而定吧。

/*方法一: 1,'1' 会被认为是相同的; 所有hash对象,如:{x;1},{y:1}会被认为是相同的 //10ms */
Array.prototype.unique=function(){
  var newArr=[],obj={};
  for(var i=0,len=this.length;i<len;i++){
    if(!obj[this[i]]){ 
      newArr.push(this[i]);
      obj[this[i]]=true;
    }
  }
  return newArr;
}

/*方法一改进版:所有hash对象,如:{x;1},{y:1}会被认为是相同的 //30ms*/
Array.prototype.unique=function(){
  var newArr=[],obj={};
  for(var i=0,len=this.length;i<len;i++){
    if(!obj[typeof(this[i])+this[i]]){ 
      newArr.push(this[i]);
      obj[typeof(this[i])+this[i]]=this[i];
    }
  }
  return newArr;
}

/*方法二: 去重结果最好,但耗性能   //250ms*/
Array.prototype.unique=function(){
  var newArr=this.concat();
  for(var i=0,len=newArr.length;i<len;i++) {
    for(var j=i+1,len=newArr.length;j<len;j++) {
      //注意 ===
      if(newArr[i]===newArr[j]) {
        newArr.splice(j,1);
        j--;
      }
    }
  }
  return newArr;
}

/*方法三: 不能去重hash对象 //25ms */
Array.prototype.unique = function(){
  var newArr = []; //一个新的临时数组
  for(var i = 0,len=this.length; i < len; i++){    
    if (newArr.indexOf(this[i]) == -1){  //如果当前数组的第i已经保存进了临时数组,那么跳过,否则把当前项push到临时数组里面
      newArr.push(this[i]);
    }
  }
  return newArr;
}


var arr0=[11,21,221,13,24,"134","1",{x:1,y:1},{name:"pobaby",age:"12",hobby:"football"},{name:"pobaby1",age:"121",hobby:"football1"},{x:134},{y:132},{x:143},{y:3421},"神秘人物", "火柴人技巧格斗", "超音速战场", "小小辛打砖块", "火柴人技巧格斗", "加菲猫超人", "小小辛打砖块", "卑鄙的我2", "电流导线", "飞天手推车","神D秘人物", "火柴人S技巧格斗", "超音SD速战场", "小小SD辛打砖块", "火柴人SD技巧格斗", "加菲S猫超人", "小小DF辛打砖块", "卑鄙的FS我2", "电D流导线", "飞天SD手推车","神秘SD人物", "火柴人技D巧格斗", "超音ASD速战场", "小小辛打SAD砖块", "火柴人技SD巧格斗", "加菲FDS猫超人", "小小辛打SDF砖块", "卑鄙SDF的我2", "电流SDF导线", "飞天手DF推车","神秘SD人物", "火柴人技AS巧格斗", "超音速战FS场", "小小辛SDF打砖块", "火柴人SDF技巧格斗", "加菲SD猫超人",113,231,2221,123,234,"1334","21",{x:13,y:132},{name:"pobaby2",age:"122",hobby:"football2"},{name:"pobaby13",age:"1231",hobby:"football41"},{x:13544},{y:1352},{x:14543},{y:34521},"神秘人sd物", "火柴人技sd巧格斗", "超音速sd战场", "小小辛sd打砖块", "火柴人技巧gw格斗", "加菲猫ui超人", "小小辛yi打砖块", "卑鄙的yi我2", "电流yt导线", "飞天手ytui推车","神Dyu秘人物", "火yui柴人S技yui巧格斗", "超音SDyu速战场", "小小SD辛打砖uyi块", "火柴yui人SD技巧格斗", "加yui菲S猫超人", "小小DF辛打砖ui块", "卑鄙uyi的FS我2", "电D流导yui线", "飞天SD手推uyi车","神i秘SD人物", "火柴人技Dhk巧格斗", "超音ASD速战hk场", "小小辛打SAhkD砖块", "火柴人技SD巧ghk格斗", "加菲FDS猫k超人", "小小辛打SDF砖ytui块", "卑鄙SDF的yui我2", "电流SDyuF导线", "飞天手yuiDF推车","神iy秘SD人hk物", "火柴uyi人技AS巧格hk斗", "超音hg速战FS场", "小小辛SDF打砖hjk块", "火柴人SDF技hj巧格斗", "加菲SDhk猫超人" ];

/*十万个随机数据*/
var arr=[],num;
for(var i = 0; i < 100000; i++){
  num=Math.floor(Math.random()*50);
  arr.push(arr0[num]);
}


var t1= new Date().getTime(); console.log(t1); //开始时间

arr.unique(); //去重

var t2 = new Date().getTime(); console.log(t2); //结束时间

console.log(t2-t1);
Javascript 相关文章推荐
HTML颜色选择器实现代码
Nov 23 Javascript
javascript动态加载三
Aug 22 Javascript
两种方法实现文本框输入内容提示消失
Mar 17 Javascript
javascript 表格内容排序 简单操作示例代码
Jan 03 Javascript
可自定义速度的js图片无缝滚动示例分享
Jan 20 Javascript
原生javascript实现Tab选项卡切换功能
Jan 12 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
Mar 02 Javascript
JS解析XML文件和XML字符串详解
Apr 17 Javascript
vue-auto-focus: 控制自动聚焦行为的 vue 指令方法
Aug 25 Javascript
记录vue项目中遇到的一点小问题
May 14 Javascript
vue+canvas实现移动端手写签名
May 21 Javascript
angular共享依赖的解决方案分享
Oct 15 Javascript
JavaScript检测字符串中是否含有html标签实现方法
Jul 01 #Javascript
JS实现简单的图书馆享元模式实例
Jun 30 #Javascript
JS建造者模式基本用法实例分析
Jun 30 #Javascript
JS模式之简单的订阅者和发布者模式完整实例
Jun 30 #Javascript
JS模式之单例模式基本用法
Jun 30 #Javascript
js简单工厂模式用法实例
Jun 30 #Javascript
JavaScript判断undefined类型的正确方法
Jun 30 #Javascript
You might like
两种php调用Java对象的方法
2006/10/09 PHP
我用php+mysql写的留言本
2006/10/09 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
PHP中的函数声明与使用详解
2017/05/27 PHP
PHP配置ZendOpcache插件加速
2019/02/14 PHP
jquery select操作的日期联动实现代码
2009/12/06 Javascript
JavaScript高级程序设计 读书笔记之十一 内置对象Global
2012/03/07 Javascript
Android中资源文件(非代码部分)的使用概览
2012/12/18 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
Jquery的each里用return true或false代替break或continue
2014/05/21 Javascript
更快的异步执行(setTimeout多浏览器)
2014/08/12 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
js实现获取鼠标当前的位置
2016/12/14 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
判断颜色是否合法的正则表达式(详解)
2017/05/03 Javascript
基于hover的用法实例(推荐)
2017/07/04 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
node.js微信小程序配置消息推送的实现
2019/02/13 Javascript
javascript实现画板功能
2020/04/12 Javascript
vue中的.$mount('#app')手动挂载操作
2020/09/02 Javascript
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
Python利用BeautifulSoup解析Html的方法示例
2017/07/30 Python
python如何保存文本文件
2020/06/07 Python
python3获取控制台输入的数据的具体实例
2020/08/16 Python
python绘制趋势图的示例
2020/09/17 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
HTML5-WebSocket实现聊天室示例
2016/12/15 HTML / CSS
html5 兼容IE6结构的实现代码
2012/05/14 HTML / CSS
校领导推荐信
2013/11/01 职场文书
教师自我剖析材料范文
2014/09/30 职场文书
同学会邀请函模板
2015/01/30 职场文书
2015年人民调解工作总结
2015/05/18 职场文书
大学生村官驻村工作心得体会
2016/01/23 职场文书
python通过opencv调用摄像头操作实例分析
2021/06/07 Python
React如何使用axios请求数据并把数据渲染到组件
2022/08/05 Javascript