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 相关文章推荐
JavaScript 事件记录使用说明
Oct 20 Javascript
JQuery实现简单时尚快捷的气泡提示插件
Dec 20 Javascript
jquery实现表格本地排序的方法
Mar 11 Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
Apr 01 Javascript
jQuery实现的调整表格行tr上下顺序
Jan 10 Javascript
深入理解jquery自定义动画animate()
May 24 Javascript
jQuery学习笔记之入门
Dec 14 Javascript
Ionic3实现图片瀑布流布局
Aug 09 Javascript
修改node.js默认的npm安装目录实例
May 15 Javascript
vue自动化路由的实现代码
Sep 30 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
Jul 20 Javascript
JavaScript实现动态生成表格
Aug 02 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+MYSQL会员系统的登陆即权限判断实现代码
2011/09/23 PHP
工厂模式在Zend Framework中应用介绍
2012/07/10 PHP
php连接mssql的一些相关经验及注意事项
2013/02/05 PHP
PHP自定义大小验证码的方法详解
2013/06/07 PHP
PHP把小数转成整数3种方法
2014/06/30 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
YII Framework教程之异常处理详解
2016/03/14 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
PHP实现负载均衡下的session共用功能
2018/04/17 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
2012/06/22 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
怎么选择Javascript框架(Javascript Framework)
2013/11/22 Javascript
textarea 控制输入字符字节数(示例代码)
2013/12/27 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
JavaScript中的函数模式详解
2015/02/11 Javascript
javascript图片滑动效果实现
2021/01/28 Javascript
详解JavaScript中Hash Map映射结构的实现
2016/05/21 Javascript
vue2.0父子组件间通信的实现方法
2017/04/19 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
2018/09/29 Javascript
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
python 对key为时间的dict排序方法
2018/10/17 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
python编写猜数字小游戏
2019/10/06 Python
python如何写出表白程序
2020/06/01 Python
自荐书范文
2013/12/08 职场文书
劲霸男装广告词改编版
2014/03/21 职场文书
志愿者宣传口号
2014/06/17 职场文书
员工工作自我评价
2014/09/26 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
大学生村官驻村工作心得体会
2016/01/23 职场文书
初中历史教学反思
2016/02/19 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
2021/07/01 Java/Android