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 相关文章推荐
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
Aug 21 Javascript
jQuery DOM操作小结与实例
Jan 07 Javascript
jQuery绑定事件不执行但alert后可以正常执行
Jun 03 Javascript
加随机数引入脚本不让浏览器读取缓存
Sep 04 Javascript
JS实现从网页顶部掉下弹出层效果的方法
Aug 06 Javascript
使用Bootstrap + Vue.js实现添加删除数据示例
Feb 27 Javascript
React学习笔记之条件渲染(一)
Jul 02 Javascript
用Vue写一个分页器的示例代码
Apr 22 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
Aug 09 Javascript
Vue 实现输入框新增搜索历史记录功能
Oct 15 Javascript
Layui实现主窗口和Iframe层参数传递
Nov 14 Javascript
如何在微信小程序中使用骨架屏的步骤
Jun 12 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 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
js 判断checkbox是否选中的实现代码
2010/11/23 Javascript
JS.findElementById()使用介绍
2013/09/21 Javascript
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
2013/11/28 Javascript
基于jquery实现等比缩放图片
2014/12/03 Javascript
JavaScript实现带标题的图片轮播特效
2015/05/20 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
点击页面任何位置隐藏div的实现方法
2016/09/05 Javascript
最通俗易懂的javascript变量提升详解
2017/08/05 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
2017/11/27 Javascript
JavaScript实现无限级递归树的示例代码
2019/03/29 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
一分钟学会JavaScript中的try-catch
2020/12/14 Javascript
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
django框架模板中定义变量(set variable in django template)的方法分析
2019/06/24 Python
10款最好的Python开发编辑器
2019/07/03 Python
Python连接Mysql进行增删改查的示例代码
2020/08/03 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
2020/10/29 Python
HTML5的结构和语义(4):语义性的内联元素
2008/10/17 HTML / CSS
美国领先的精品家居照明和装饰产品在线零售商:LightsOnline.com
2018/01/23 全球购物
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
全球性的众包图形设计市场:DesignCrowd
2021/02/02 全球购物
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/09/18 面试题
《蒙娜丽莎之约》教学反思
2014/02/27 职场文书
机关工会开展学习雷锋活动总结
2014/03/01 职场文书
大学生社会实践自我鉴定
2014/03/24 职场文书
诉讼财产保全担保书
2014/05/20 职场文书
建筑学专业自荐书
2014/07/09 职场文书
教师党员批评与自我批评
2014/10/15 职场文书
工作失职检讨书500字
2014/10/17 职场文书
评职称个人总结
2015/03/05 职场文书
企业法人代表证明书
2015/06/18 职场文书
2016校本研修培训心得体会
2016/01/08 职场文书
解析MySQL binlog
2021/06/11 MySQL
python工具dtreeviz决策树可视化和模型可解释性
2022/03/03 Python