javascript数组去重方法汇总


Posted in Javascript onApril 23, 2015

javascript数组去重方法汇总

Array.prototype.unique1 = function () {
 var n = []; //一个新的临时数组
 for (var i = 0; i < this.length; i++) //遍历当前数组
 {
  //如果当前数组的第i已经保存进了临时数组,那么跳过,
  //否则把当前项push到临时数组里面
  if (n.indexOf(this[i]) == -1) n.push(this[i]);
 }
 return n;
};
Array.prototype.unique2 = function()
{
  var n = {},r=[]; //n为hash表,r为临时数组
  for(var i = 0; i < this.length; i++) //遍历当前数组
  {
    if (!n[this[i]]) //如果hash表中没有当前项
    {
      n[this[i]] = true; //存入hash表
      r.push(this[i]); //把当前数组的当前项push到临时数组里面
    }
  }
  return r;
};
Array.prototype.unique3 = function()
{
  var n = [this[0]]; //结果数组
  for(var i = 1; i < this.length; i++) //从第二项开始遍历
  {
    //如果当前数组的第i项在当前数组中第一次出现的位置不是i,
    //那么表示第i项是重复的,忽略掉。否则存入结果数组
    if (this.indexOf(this[i]) == i) n.push(this[i]);
  }
  return n;
};
Array.prototype.unique4 = function()
{
  this.sort();
  var re=[this[0]];
  for(var i = 1; i < this.length; i++)
  {
    if( this[i] !== re[re.length-1])
    {
      re.push(this[i]);
    }
  }
  return re;
};
var arr = [1,2,2,2,3,3,4,5];
console.log(arr.unique1()); // [1, 2, 3, 4, 5]
console.log(arr.unique2()); // [1, 2, 3, 4, 5]
console.log(arr.unique3()); // [1, 2, 3, 4, 5]
console.log(arr.unique4()); // [1, 2, 3, 4, 5]

其中第1种和第3种方法都用到了数组的indexOf方法。此方法的目的是寻找存入参数在数组中第一次出现的位置。很显然,js引擎在实现这个方法的时候会遍历数组直到找到目标为止。所以此函数会浪费掉很多时间。 而第2中方法用的是hash表。把已经出现过的通过下标的形式存入一个object内。下标的引用要比用indexOf搜索数组快的多。

第四种方法的思路是先把数组排序,然后比较相邻的两个值。 排序的时候用的JS原生的sort方法,JS引擎内部应该是用的快速排序吧。 最终测试的结果是此方法运行时间平均是第二种方法的三倍左右,不过比第一种和第三种方法快了不少。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
检测是否已安装 .NET Framework 3.5的js脚本
Feb 14 Javascript
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
Jun 28 Javascript
JavaScript闭包 懂不懂由你反正我是懂了
Oct 21 Javascript
JavaScript打开word文档的实现代码(c#)
Apr 16 Javascript
node.js中使用socket.io制作命名空间
Dec 15 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
Jun 25 Javascript
jQuery实现多级下拉菜单jDropMenu的方法
Aug 28 Javascript
js+css实现select的美化效果
Mar 24 Javascript
JS常用算法实现代码
Nov 14 Javascript
js 模仿锚点定位的实现方法
Nov 19 Javascript
Javascript中call,apply,bind方法的详解与总结
Dec 12 Javascript
原生js中运算符及流程控制示例详解
Jan 05 Javascript
javascript实现英文首字母大写
Apr 23 #Javascript
原生js和jquery实现图片轮播淡入淡出效果
Apr 23 #Javascript
浅谈javascript中for in 和 for each in的区别
Apr 23 #Javascript
原生js和jquery实现图片轮播特效
Apr 23 #Javascript
使用纯javascript实现经典扫雷游戏
Apr 23 #Javascript
jQuery图片特效插件Revealing实现拉伸放大
Apr 22 #Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
Apr 22 #Javascript
You might like
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
php生成随机字符串可指定纯数字、纯字母或者混合的
2014/04/18 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
PHP SPL标准库之接口(Interface)详解
2015/05/11 PHP
php实现在站点里面添加邮件发送的功能
2020/04/28 PHP
简单的js表单验证函数
2013/10/28 Javascript
jquery实现人性化的有选择性禁用鼠标右键
2014/06/30 Javascript
AngularJS入门教程之AngularJS模型
2016/04/18 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
2016/12/27 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
详解element-ui日期时间选择器的日期格式化问题
2019/04/08 Javascript
Vue+Express实现登录注销功能的实例代码
2019/05/05 Javascript
详解mpvue中使用vant时需要注意的onChange事件的坑
2019/05/16 Javascript
亲自动手实现vue日历控件
2019/06/26 Javascript
vue 根据选择条件显示指定参数的例子
2019/11/09 Javascript
解决Vue router-link绑定事件不生效的问题
2020/07/22 Javascript
[40:05]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
PYTHON EVAL的用法及注意事项解析
2019/09/06 Python
python实现大战外星人小游戏实例代码
2019/12/26 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
2021年值得向Python开发者推荐的VS Code扩展插件
2021/01/25 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
配置H5的滚动条样式的示例代码
2018/03/09 HTML / CSS
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
实习护士自我鉴定
2013/10/13 职场文书
服装厂厂长岗位职责
2013/12/27 职场文书
优秀毕业生自我鉴定
2014/02/11 职场文书
项目总经理岗位职责
2014/02/14 职场文书
党员承诺践诺书
2014/05/20 职场文书
关于工作经历的证明书
2014/10/11 职场文书
2014年消防工作总结
2014/11/21 职场文书
努力工作保证书
2015/02/28 职场文书
VW、VH适配移动端的解决方案与常见问题
2023/05/21 HTML / CSS