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用图作提交按钮或超连接
Mar 26 Javascript
IE6弹出“已终止操作”的解决办法
Nov 27 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
Aug 15 Javascript
js实现可折叠展开的手风琴菜单效果
Sep 07 Javascript
JS实现仿Windows经典风格的选项卡Tab切换代码
Oct 20 Javascript
JQuery 动态生成Table表格实例代码
Dec 02 Javascript
基于JavaScript实现的折半查找算法示例
Apr 14 Javascript
读懂CommonJS的模块加载
Apr 19 Javascript
Vue 2.0 侦听器 watch属性代码详解
Jun 19 Javascript
详解vuex的简单todolist例子
Jul 14 Javascript
JS实现页面跳转与刷新的方法汇总
Aug 30 Javascript
vue点击当前路由高亮小案例
Sep 26 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函数实例
2014/10/22 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
用js判断用户浏览器是否是XP SP2的IE6
2007/03/08 Javascript
JavaScript入门教程(3) js面向对象
2009/01/31 Javascript
JS.findElementById()使用介绍
2013/09/21 Javascript
Extjs grid添加一个图片状态或者按钮的方法
2014/04/03 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
JS+CSS实现精美的二级导航效果代码
2015/09/17 Javascript
javascript动态生成树形菜单的方法
2015/11/14 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
2016/11/11 Javascript
Windows下使用Nodejs运行js的方法
2017/09/02 NodeJs
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
JS打印彩色菱形的实例代码
2018/08/15 Javascript
angular 服务随记小结
2019/05/06 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
2020/07/24 Javascript
解决vue页面渲染但dom没渲染的操作
2020/07/27 Javascript
浅谈JavaScript中的“!!”作用
2020/08/03 Javascript
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
详解python播放音频的三种方法
2019/09/23 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
2019/12/11 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
阿迪达斯英国官方网站:adidas英国
2019/08/13 全球购物
速卖通欧盟:Aliexpress EU
2020/08/19 全球购物
工作决心书
2014/03/11 职场文书
经营管理策划方案
2014/05/22 职场文书
工商管理专业自荐信
2014/06/03 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
2014年卫生工作总结
2014/11/27 职场文书
2015年维修工作总结
2015/04/25 职场文书
秋收起义观后感
2015/06/11 职场文书
MySql开发之自动同步表结构
2021/05/28 MySQL
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python
windows系统搭建WEB服务器详细教程
2022/08/05 Servers