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 相关文章推荐
jQuery 定时局部刷新(setInterval)
Nov 19 Javascript
js模拟点击以提交表单为例兼容主流浏览器
Nov 29 Javascript
JavaScript设计模式之建造者模式介绍
Dec 28 Javascript
JS绘制生成花瓣效果的方法
Aug 05 Javascript
基于insertBefore制作简单的循环插空效果
Sep 21 Javascript
给easyui的datebox控件添加清空按钮的实现方法
Nov 09 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
Jan 04 Javascript
javascript 跨域问题以及解决办法
Jul 17 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
Mar 16 Javascript
Vue+Element实现动态生成新表单并添加验证功能
May 23 Javascript
新手快速入门微信小程序组件库 iView Weapp
Jun 24 Javascript
Vue 自定义指令功能完整实例
Sep 17 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中SQL注入攻击与XSS攻击
2012/06/10 PHP
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
js滚动条回到顶部的代码
2011/12/06 Javascript
js里怎么取select标签里的值并修改
2012/12/10 Javascript
iframe如何动态创建及释放其所占内存
2014/09/03 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
angularjs封装$http为factory的方法
2017/05/18 Javascript
基于JS脚本语言的基础语法详解
2017/07/22 Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
2020/04/29 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
通过实例解析vuejs如何实现调试代码
2020/07/16 Javascript
JavaScript仿京东轮播图效果
2021/02/25 Javascript
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python语言实现机器学习的K-近邻算法
2015/06/11 Python
Python的净值数据接口调用示例分享
2016/03/15 Python
Python实现多进程共享数据的方法分析
2017/12/04 Python
Python爬虫动态ip代理防止被封的方法
2019/07/07 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
2020/05/19 Python
python线程池如何使用
2020/05/28 Python
Huda Beauty官方商店:化妆和美容产品
2020/09/05 全球购物
光声世纪笔试题目
2012/08/25 面试题
学生就业推荐信
2013/11/13 职场文书
签约仪式主持词
2014/03/19 职场文书
低碳生活倡议书
2014/04/14 职场文书
勤俭节约倡议书
2014/04/14 职场文书
创建绿色学校先进个人材料
2014/08/20 职场文书
答谢词范文
2015/01/05 职场文书
2015年复活节活动总结
2015/02/27 职场文书
2015年乡镇平安建设工作总结
2015/05/13 职场文书
国际贸易实训总结
2015/08/03 职场文书
2016年学校十一国庆节活动总结
2016/04/01 职场文书
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript
MySQL数据库如何使用Shell进行连接
2022/04/12 MySQL