面试前端必须准备的一个问题:怎样去掉Javascript的Array的重复项。据我所知,百度、腾讯、盛大等都在面试里出过这个题目。 这个问题看起来简单,但是其实暗藏杀机。 考的不仅仅是实现这个功能,更能看出你对计算机程序执行的深入理解。

我总共想出了三种算法来实现这个目的:

  1. 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;
    }
  2. 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;
    }
  3. 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表。这就是所谓的空间换时间。  就是这个测试页面,你也可以去看看。

2010年10月7日更新:

根据hpl大牛的思路,我写了第四种方法:

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引擎内部应该是用的快速排序吧。 最终测试的结果是此方法运行时间平均是第二种方法的三倍左右,不过比第一种和第三种方法快了不少。

两个for循环实现数组去重

<script>
var arr = [11, 22, 3, 5, 2, 11, 3, 4, 7, 5, 11, 3];
var len = arr.length;
var i = 0;
var j = 0;
for(i = 0; i< len; i++)
{
for(j = i+1; j<len;j++)
{
if(arr[i] == arr[j])
{
arr.splice(j,1);
}
}
}
console.log(arr);
</script>

jSON去重

      //JSON数据去重Array.prototype.removeRepeatAttr  = function(){var tmp = {},a=this.slice();for(var i = j = 0; i < a.length;i++){if(!tmp[a[i].id]){tmp[a[i].id]=1;j++;}else{this.splice(j,1);}}}var arr8 = [                                                          {"id":1},{"id":2},{"id":1},{"id":1}]            arr8.removeRepeatAttr();console.log(arr8);

  

转载于:https://www.cnblogs.com/mingjixiaohui/p/5507242.html

js数组去重的4个方法相关推荐

  1. 原生JS数组去重的几种方法

    有时候我们做项目的时候往往会需要把数组里面一些重复的项去掉,但是原生JS有排序,有筛选等等,但是就是没有数组去重怎么办呢? 这能怎么办,自己手动实现嘛.(以下代码直接在原型上添加的的方法,为的就是和原 ...

  2. js数组去重的三种常用方法

    第一种是比较常规的方法 思路: 1.构建一个新的数组存放结果 2.for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比 3.若结果数组中没有该元素,则存到结果数组中 Array.pro ...

  3. js数组去重(9种方法),你都会了吗?

    以下共有九种数组去重的方式和详解(包含对象数组去重): 1.利用Array.from(new Set)去重: // 1.利用set去重 // Set是es6新增的数据结构,似于数组,但它的一大特性就是 ...

  4. JS 数组去重的4个方法

    JavaScript 数组去重的方法 方法一: 两层for语句遍历判断 方法二: 通过数组API indexOf()进行筛选 方法三: 通过数组API includes()进行筛选 方法四: 通过Se ...

  5. js数组 去重的5种方法

    // 数组去重 var arr = [1, 2, 2, 3, 4, 4, 5, 6, 7, 7, 4, 3, 5, 7, 11, 12, 11]; var newArr = [];//方法1最优 se ...

  6. js数组去重的几种方法

    // 数组去重1:var arr = [1, 6, 6, 6, 3, 9, 4, 9, 3, 8, 2, 2]var newArr = []console.log(arr, '原数组');var fl ...

  7. js数组去重的四种方法

    四种算法来实现这个目的: Array.prototype.unique1 = function () {var n = []; //一个新的临时数组for (var i = 0; i < thi ...

  8. js 数组去重的几种方法

    1. new Set 的两种方法 let arr = [1, 0, 0, 2, 9, 8, 3, 1];function unique(arr) {return Array.from(new Set( ...

  9. JS — 数组去重(4种方法)

    第一种:双重循环 var strCode='zxcvbnmasdfghjklopiuytrewqAWEDRFTGYHUJIK'; var str=''; for(var i=0;i<4;i++) ...

最新文章

  1. 不管马斯克怎么说,中国智能汽车激光雷达军备竞赛已经开始
  2. 《游戏引擎架构》笔记十四
  3. hdu 3007【爬山算法】
  4. 【PHP 扩展开发】Zephir 基础篇
  5. 力扣算法题—075颜色分类
  6. java接口fastjson_走进Java接口测试之fastjson指南
  7. Htmlt_Div+Css简介
  8. AWS 之于 K8s,如同 Windows 之于 Linux!
  9. python与excel-python3与Excel的完美结合
  10. 02函数极限存在条件
  11. Arduino Atmega328P烧写bootloader及熔丝
  12. PLC编程语言你知道多少
  13. 网易云音乐安装完成以后点击图标打不开的解决办法
  14. 上交所实时行情文件汇总
  15. Android一键锁屏与抬手亮屏的实现
  16. wince之WiFi漫游的工作原理
  17. 三菱Plc怎么用c语言编程,如何用程序在三菱PLC上写出配方功能
  18. 做自媒体,宝妈萌娃类视频尤其要注意,越好的视频越有节奏感
  19. 人工智能热卖榜图书《人工智能怎么学》
  20. 齐岳定制EG/Li-BH4复合储氢材料/La2Mg17-Ni复合储氢材料/Mg-Nb/Mg-Nb2O5复合储氢粉体复合材料

热门文章

  1. python 方差_python统计分析总体方差检验
  2. python中 将字符串和字典的相互转换
  3. Struts2第九篇【OGNL、valueStack详解】
  4. 修改服务器Apache-Coyote/1.1标识为自定义内容
  5. day23 内置函数,匿名函数,递归
  6. visualstudio学习
  7. mysql计算经纬度亮点之间的距离
  8. 浅谈linux中的grub
  9. (转) mp4编码全介绍 (一)
  10. 在SQL Server 2000中使用Transact-SQL建立数据库