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 相关文章推荐
Js 订制自己的AlertBox(信息提示框)
Jan 09 Javascript
javascript fullscreen全屏实现代码
Apr 09 Javascript
ExtJs grid行 右键菜单的两种方法
Jun 19 Javascript
JS中Date日期函数中的参数使用介绍
Jan 02 Javascript
Javascript中Array.prototype.map()详解
Oct 22 Javascript
全面介绍javascript实用技巧及单竖杠
Jul 18 Javascript
基于jQuery实现简单人工智能聊天室
Feb 10 Javascript
基于input框覆盖掉数字英文的实例讲解
Jul 21 Javascript
深入解析koa之异步回调处理
Jun 17 Javascript
微信小程序实现二维码签到考勤系统
Jan 16 Javascript
html-webpack-plugin修改页面的title的方法
Jun 18 Javascript
在vant中使用时间选择器和popup弹出层的操作
Nov 04 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中通过语义URL防止网站被攻击的方法分享
2011/09/08 PHP
PHP设计模式之迭代器模式
2016/06/17 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
jquery 插件学习(一)
2012/08/06 Javascript
Jquery实现显示和隐藏的4种简单方式
2013/08/28 Javascript
对于Form表单reset方法的新认识
2014/03/05 Javascript
js弹出确认是否删除对话框
2014/03/27 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
document.forms用法示例介绍
2014/06/26 Javascript
浅谈javascript中onbeforeunload与onunload事件
2015/12/10 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
python算法学习之桶排序算法实例(分块排序)
2013/12/18 Python
详解python基础之while循环及if判断
2017/08/24 Python
Django Admin实现三级联动的示例代码(省市区)
2018/06/22 Python
树莓派+摄像头实现对移动物体的检测
2019/06/22 Python
将python2.7添加进64位系统的注册表方式
2019/11/20 Python
关于Python3 lambda函数的深入浅出
2019/11/27 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
PyTorch中Tensor的数据统计示例
2020/02/17 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
2020/04/30 Python
python安装cx_Oracle和wxPython的方法
2020/09/14 Python
Python绘制组合图的示例
2020/09/18 Python
HTML5拖拽的简单实例
2016/05/30 HTML / CSS
Baracuta官方网站:Harrington夹克,G9,G4,G10等
2018/03/06 全球购物
正宗的日本零食和糖果订阅盒:Bokksu
2019/11/21 全球购物
税务会计岗位职责
2014/02/18 职场文书
匿名信格式范文
2015/05/27 职场文书
高中军训感想
2015/08/07 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
深入理解python多线程编程
2021/04/18 Python
MYSQL 运算符总结
2021/11/11 MySQL
Oracle表空间与权限的深入讲解
2021/11/17 Oracle
如何在python中实现ECDSA你知道吗
2021/11/23 Python