来来来 ,整理完数组排序 ,咱们再来看看数组去重 。这个可以说有很多方式了 。之前看过的算法方式太多 ,导致思路其实有时候真的很受限,不过也是整理来学习用的 啊,小婊贝们~
首先呢 ,我们来看看思路比较直接的方法,基本思路就是声明一个新数组arr_n,将【0】这个成员压入arr;然后从【1】开始循环当前数组,设置一个变量a,给他一个初始值1;内层嵌套从【0】对arr_n数组的循环 ,用外层对当前数组循环的当前项this[i]和arr_n的每一项arr_n[j]进行对比,如果有相等,则将0赋值给a,然后break退出内层循环;判断a的值,若等于初始值则说明遍历完arr_n并没有重复,则将当前this[i]压入新数组 arr_n,以此类推 ,直到所有排序完成 ,返回新数组 arr_n; 代码如下:
Array.prototype.unique=function(){ var arr_n=[]; arr_n.push(this[0]); for(var i=1;i<this.length;i++){ var a=1; for(var j=0;j<arr_n.length;j++){ if(this[i]==arr_n[j]){ a=0; break; } } if(a==1){ arr_n.push(this[i]); } } return arr_n; }; var a=[1,3,4,3,5,2,5]; a.unique();
最近在看JavaScript面向对象编程这本书时发现了一个特别好的API是indexOf,后来网上查了查用在数组上其实也是很棒的有木有 ,不过还是有坑的 ,下面关于indexOf对数组用法是复制来的 ,因为觉得很浅显易懂了,大家共勉 ,大家看看别踩了坑 就行;再者就是 indexOf是ES5的语法 ,不支持IE8以下的浏览器(无奈摊手~ )
let arr = ['orange', '2016', '2016']; arr.indexOf('orange'); //0 arr.indexOf('o'); //-1 arr.indexOf('2016'); //1 arr.indexOf(2016); //-1 这里没把例子拆的那么细,四个用例足以说明问题。 arr.indexOf(‘orange') 输出 0 因为 ‘orange' 是数组的第 0 个元素,匹配到并返回下标。 arr.indexOf(‘o') 输出 -1 因为此方法不会在每一个元素的基础上再次执行 indexOf 匹配。 arr.indexOf(‘2016') 输出 1 因为此方法从头匹配直到匹配到时返回第一个数组元素的下表,而不是返回全部匹配的下标。 arr.indexOf(2016) 输出 -1 注意:这里不会做隐式类型转换。
以下是运用indexOf的代码段:
Array.prototype.unique1=function(){ var arr_n=[]; arr_n.push(this[0]); for(var i=1;i<this.length;i++){ if( arr_n.indexOf(this[i])==-1){ arr_n.push(this[i]); } } return arr_n; } var b=[12,3,4,5,3,5,3,7,12]; b.unique1();
还有一种方法 ,我认为是比较好的了 ,简洁又不存在兼容性问题,思路也很简单 ,先声明一个空数组和一个object对象,循环遍历当前数组,将数组的每一项当做object的属性来看 ,判断对象是否已有当前项的属性即可 ,若不重复,将当前this[i]push进新数组,给object的this[i]属性赋个值即可,最后返回新数组;代码如下:
Array.prototype.unique2=function(){ var arr_n=[],obj={}; for(var i=0;i<this.length;i++){ if(!obj[this[i]]){ arr_n.push(this[i]); obj[this[i]]=1; } } return arr_n; }; var b=[12,3,4,5,3,5,3,7,12]; b.unique2();
如果你也刚好入门 ,刚好对去重算法比较懵懂 ,希望对你有些许帮助!