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 相关文章推荐
JS应用之禁止抓屏、复制、打印
Feb 21 Javascript
node.js中的http.response.write方法使用说明
Dec 14 Javascript
详解Document.Cookie
Dec 25 Javascript
基于jquery实现无限级树形菜单
Mar 22 Javascript
javascript断点调试心得分享
Apr 23 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
Nov 11 Javascript
js编写选项卡效果
May 23 Javascript
详解js中Array的方法及技巧
Sep 12 Javascript
读懂CommonJS的模块加载
Apr 19 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
May 26 Javascript
JavaScript Window浏览器对象模型原理解析
May 30 Javascript
关于vue属性使用和不使用冒号的区别说明
Oct 22 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
《Re:从零开始的异世界生活》剧情体验,手游新作定名
2020/04/09 日漫
ftp类(example.php)
2006/10/09 PHP
PHP实现分页的一个示例
2006/10/09 PHP
ThinkPHP实现一键清除缓存方法
2014/06/26 PHP
php使用正则表达式获取图片url的方法
2015/01/16 PHP
php从字符串创建函数的方法
2015/03/16 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
jQuery开发者都需要知道的5个小技巧
2010/01/08 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
JQuery动画和停止动画实例代码
2013/03/01 Javascript
jquery设置控件位置的方法
2013/08/21 Javascript
Jquery实现的tab效果可以指定默认显示第几页
2013/10/16 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
2013/12/05 Javascript
使用node.js半年来总结的 10 条经验
2014/08/18 Javascript
jQuery实现视频作为全屏幕背景
2014/12/18 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
js验证真实姓名与身份证号,手机号的简单实例
2016/07/18 Javascript
AngularJs bootstrap搭载前台框架——js控制部分
2016/09/01 Javascript
AngularJs Forms详解及简单示例
2016/09/01 Javascript
jQuery删除当前节点元素
2016/12/07 Javascript
Javascript基础回顾之(三) js面向对象
2017/01/31 Javascript
用最少的JS代码写出贪吃蛇游戏
2018/01/12 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
2019/04/30 Javascript
微信小程序搭建自己的Https服务器
2019/05/02 Javascript
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
2019/06/14 Javascript
jQuery实现简单聊天室
2020/02/08 jQuery
基于Vue CSR的微前端实现方案实践
2020/05/27 Javascript
[58:32]EG vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
详解Python中的变量及其命名和打印
2016/03/11 Python
python中set()函数简介及实例解析
2018/01/09 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
2018/09/25 Python
浅析HTML5中的download属性使用
2019/03/13 HTML / CSS
UNIX文件类型
2013/08/29 面试题
竞选大队委员演讲稿
2014/04/28 职场文书
社区志愿者活动总结
2014/06/26 职场文书