javascript数组去重的方法汇总


Posted in Javascript onApril 14, 2015

四种算法来实现这个目的:

第一种:

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;
} //此方法比较推荐 ,但不能呢过考虑到“222”和222的问题

第二种改进版:

//类hash方法的改进版
Array.prototype.unique2 = function () {
  var n = {}, r = [];
  for (var i = 0; i < this.length; i++) {
    if (!n[typeof (this[i]) + this[i]]) {
      n[typeof (this[i]) + this[i]] = true;
      r.push(this[i])
    }
  }
  return r
};

var arr=["222",222,2,2,3];
var newarry=arr.unique2();
console.log(newarry[newarry.length-1]);

  

第三种:

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;
}

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

    为了判断这三种方法的效率如何,我做了一个测试程序,生成一个10000长度的随机数组成的数组,然后分别用几个方法来测试执行时间。 结果表明第二种方法远远快于其他两种方法。 但是内存占用方面应该第二种方法比较多,因为多了一个hash表。这就是所谓的空间换时间。  就是这个 测试页面,你也可以去看看。

第四种方法:

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;
}

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

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

Javascript 相关文章推荐
Jquery AJAX 用于计算点击率(统计)
Jun 30 Javascript
js控制不同的时间段显示不同的css样式的实例代码
Nov 04 Javascript
JavaScript使用cookie记录临时访客信息的方法
Apr 07 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
Apr 05 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
Apr 13 Javascript
vue2.0多条件搜索组件使用详解
Mar 26 Javascript
canvas绘制爱心的几种方法总结(推荐)
Oct 31 Javascript
vue解决跨域路由冲突问题思路解析
Nov 03 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
Jan 31 jQuery
解决vue中无法动态修改jqgrid组件 url地址的问题
Mar 01 Javascript
vue 移动端注入骨架屏的配置方法
Jun 25 Javascript
vue使用Sass时报错问题的解决方法
Oct 14 Javascript
JavaScript字符串常用类使用方法汇总
Apr 14 #Javascript
JavaScript 表单处理实现代码
Apr 13 #Javascript
JavaScript 事件绑定及深入
Apr 13 #Javascript
JavaScript 事件对象介绍
Apr 13 #Javascript
JavaScript 事件入门知识
Apr 13 #Javascript
JavaScript 动态加载脚本和样式的方法
Apr 13 #Javascript
JavaScript DOM元素尺寸和位置
Apr 13 #Javascript
You might like
PHP脚本的10个技巧(1)
2006/10/09 PHP
PHP缓存集成库phpFastCache用法
2014/12/15 PHP
php相对当前文件include其它文件的方法
2015/03/13 PHP
js操作select控件的几种方法
2010/06/02 Javascript
jqPlot 图表中文API使用文档及源码和在线示例
2012/02/07 Javascript
利用javascript解决图片缩放及其优化的代码
2012/05/23 Javascript
纯文字版返回顶端的js代码
2013/08/01 Javascript
得到form下的所有的input的js代码
2013/11/07 Javascript
php跨域调用json的例子
2013/11/13 Javascript
jquery动态分页效果堪比时光网
2014/09/25 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
javascript制作的简单注册模块表单验证
2015/04/13 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
bootstrap响应式表格实例详解
2017/05/15 Javascript
JavaScript实现区块链
2018/03/14 Javascript
微信小程序实现分享朋友圈的图片功能示例
2019/01/18 Javascript
Angular封装表单控件及思想总结
2019/12/11 Javascript
Python 变量类型及命名规则介绍
2013/06/08 Python
python实现simhash算法实例
2014/04/25 Python
python装饰器与递归算法详解
2016/02/18 Python
python协程之动态添加任务的方法
2019/02/19 Python
Python使用type关键字创建类步骤详解
2019/07/23 Python
python使用minimax算法实现五子棋
2019/07/29 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
2019/08/20 Python
python自动保存百度盘资源到百度盘中的实例代码
2019/08/26 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
2019/10/12 Python
HTML5 Canvas 破碎重组的视频特效的示例代码
2019/09/24 HTML / CSS
html5 音乐播放器 audio 标签使用概述
2013/07/15 HTML / CSS
大学生期末自我鉴定
2014/02/01 职场文书
八一建军节活动方案
2014/02/10 职场文书
代办社保委托书范文
2014/10/06 职场文书
贵阳市党的群众路线教育实践活动党(工)委领导班子整改方案
2014/10/26 职场文书
2014年医院后勤工作总结
2014/12/06 职场文书