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 表单提交后按钮变灰的实例代码
Aug 16 Javascript
javascript实现原生ajax的几种方法介绍
Sep 21 Javascript
js离开或刷新页面检测(且兼容FF,IE,Chrome)
Mar 05 Javascript
javascript调试之DOM断点调试法使用技巧分享
Apr 15 Javascript
探讨js字符串数组拼接的性能问题
Oct 11 Javascript
javascript 回调函数详解
Nov 11 Javascript
JavaScript中getUTCSeconds()方法的使用详解
Jun 11 Javascript
Javascript的表单验证-提交表单
Mar 18 Javascript
JS双击变input框批量修改内容
Dec 12 Javascript
使用vue-router设置每个页面的title方法
Feb 11 Javascript
layDate日期控件使用方法详解
Nov 15 Javascript
js实现提交前对列表数据的增删改查
Jan 16 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
迅雷下载《中学科技》怀旧期刊下载
2021/02/27 无线电
php轻松实现文件上传功能
2016/03/03 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
2018/04/09 PHP
js防止表单重复提交的两种方法
2013/09/30 Javascript
获取下拉列表框的值是数组,split,$.inArray示例
2013/11/13 Javascript
屏蔽相应键盘按钮操作
2014/03/10 Javascript
js对象的复制继承实例
2015/01/10 Javascript
Node.js 学习笔记之简介、安装及配置
2015/03/03 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
2015/04/25 Javascript
图解JavaScript中的this关键字
2020/05/28 Javascript
Javascript中apply、call、bind的巧妙使用
2016/08/18 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
JS实现带动画的回到顶部效果
2017/12/28 Javascript
JavaScript实现留言板案例
2020/03/17 Javascript
[07:37]DOTA2-DPC中国联赛2月2日Recap集锦
2021/03/11 DOTA
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
python 写的一个爬虫程序源码
2016/02/28 Python
Python的collections模块中的OrderedDict有序字典
2016/07/07 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
2018/01/04 Python
Python中字符串与编码示例代码
2019/05/20 Python
python如何统计代码运行的时长
2019/07/24 Python
Python通过socketserver处理多个链接
2020/03/18 Python
5款实用的python 工具推荐
2020/10/13 Python
使用CSS3制作倾斜导航条和毛玻璃效果
2017/09/12 HTML / CSS
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
应届生简历中的自我评价
2014/01/13 职场文书
美术指导求职信
2014/03/17 职场文书
竞聘书怎么写,如何写?
2014/03/31 职场文书
大学生找工作求职信
2014/07/09 职场文书
干部四风问题整改措施思想汇报
2014/10/13 职场文书
干部作风建设年活动剖析材料
2014/10/23 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
Spring Boot 的创建和运行示例代码详解
2022/07/23 Java/Android