js数组去重的4个方法
面试前端必须准备的一个问题:怎样去掉Javascript的Array的重复项。据我所知,百度、腾讯、盛大等都在面试里出过这个题目。 这个问题看起来简单,但是其实暗藏杀机。 考的不仅仅是实现这个功能,更能看出你对计算机程序执行的深入理解。
我总共想出了三种算法来实现这个目的:
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; }
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个方法相关推荐
- 原生JS数组去重的几种方法
有时候我们做项目的时候往往会需要把数组里面一些重复的项去掉,但是原生JS有排序,有筛选等等,但是就是没有数组去重怎么办呢? 这能怎么办,自己手动实现嘛.(以下代码直接在原型上添加的的方法,为的就是和原 ...
- js数组去重的三种常用方法
第一种是比较常规的方法 思路: 1.构建一个新的数组存放结果 2.for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比 3.若结果数组中没有该元素,则存到结果数组中 Array.pro ...
- js数组去重(9种方法),你都会了吗?
以下共有九种数组去重的方式和详解(包含对象数组去重): 1.利用Array.from(new Set)去重: // 1.利用set去重 // Set是es6新增的数据结构,似于数组,但它的一大特性就是 ...
- JS 数组去重的4个方法
JavaScript 数组去重的方法 方法一: 两层for语句遍历判断 方法二: 通过数组API indexOf()进行筛选 方法三: 通过数组API includes()进行筛选 方法四: 通过Se ...
- 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 ...
- js数组去重的几种方法
// 数组去重1:var arr = [1, 6, 6, 6, 3, 9, 4, 9, 3, 8, 2, 2]var newArr = []console.log(arr, '原数组');var fl ...
- js数组去重的四种方法
四种算法来实现这个目的: Array.prototype.unique1 = function () {var n = []; //一个新的临时数组for (var i = 0; i < thi ...
- js 数组去重的几种方法
1. new Set 的两种方法 let arr = [1, 0, 0, 2, 9, 8, 3, 1];function unique(arr) {return Array.from(new Set( ...
- JS — 数组去重(4种方法)
第一种:双重循环 var strCode='zxcvbnmasdfghjklopiuytrewqAWEDRFTGYHUJIK'; var str=''; for(var i=0;i<4;i++) ...
最新文章
- 不管马斯克怎么说,中国智能汽车激光雷达军备竞赛已经开始
- 《游戏引擎架构》笔记十四
- hdu 3007【爬山算法】
- 【PHP 扩展开发】Zephir 基础篇
- 力扣算法题—075颜色分类
- java接口fastjson_走进Java接口测试之fastjson指南
- Htmlt_Div+Css简介
- AWS 之于 K8s,如同 Windows 之于 Linux!
- python与excel-python3与Excel的完美结合
- 02函数极限存在条件
- Arduino Atmega328P烧写bootloader及熔丝
- PLC编程语言你知道多少
- 网易云音乐安装完成以后点击图标打不开的解决办法
- 上交所实时行情文件汇总
- Android一键锁屏与抬手亮屏的实现
- wince之WiFi漫游的工作原理
- 三菱Plc怎么用c语言编程,如何用程序在三菱PLC上写出配方功能
- 做自媒体,宝妈萌娃类视频尤其要注意,越好的视频越有节奏感
- 人工智能热卖榜图书《人工智能怎么学》
- 齐岳定制EG/Li-BH4复合储氢材料/La2Mg17-Ni复合储氢材料/Mg-Nb/Mg-Nb2O5复合储氢粉体复合材料