在进行数组操作时往往会遇到去掉重复项的问题,下面简单介绍下数组去重的方法,以及其执行效率
方法一
采用两次循环
原理:拿当前的和他后面的比,如果后面的有重复的就干掉
但是我们发现数组最后一项,后面没有东西,那他就不用和后边的比较了,所以我们只要循环arr.length-1次就可以了
1 var arr=[1,3,5,3,5,3,4,1,3,5,3,5,3,41,3,5,3,5,3,4,1,3,5,3,5,3,4];
2 for(var i=0;i<arr.length-1;i++){
3 var curItem=arr[i];//当前项
4 for(var j=i+1;j<arr.length;j++){
5 if(curItem==arr[j]){
6 arr.splice(j,1);
7 j--;
8 }
9 }
10 }
11 console.log(arr);
此方法运用了了两次循环,给浏览器带来很大压力,次数为数组长度的阶乘。
所以考虑用对象替代(对象的属性名字不会重复)方法二
1 var arr=[1,3,5,3,5,3,4,6,2,2,2,1];
2 var len=arr.length;
3 var obj={};
4
5 for(var i=0;i<len;i++){
6 var cur=arr[i];//当前项
7 obj[cur]=cur;
8 }
9 var list=[];
10 for(key in obj){
11 list.push(obj[key])
12 }
13 console.log(list);
此方法执行效率较高,但循环使用两次
采用另一种方法:方法三
原理: 循环数组,把数组中的每一项当做obj对象的属性名和属性值存进来,
但是我们发现如果obj对象中已经存在了这个属性名的话,那就说明数组重复了,那我们删除重复的项
1 var arr=[1,3,5,3,5,3,4,1,3,5,3,5,3,41,3,5,3,5,3,4,1,3,5,3,5,3,4];
2
3 var obj={};
4 for(var i=0;i<arr.length;i++){
5 var cur=arr[i];//当前项
6 if(obj[cur]==cur){
7 arr.splice(i,1);
8 i--
9 }else{
10 obj[cur]=cur;
11 }
12
13 }
14 obj=null;
15 console.log(arr);
此方法也运用两次循环,仔细想想还有运用一次实现去重的方法。
对方法二封装成方法
1 var arr=[1,3,5,3,5,3,4,6,2,2,2,1,7,84,34,634];
2 Array.prototype.arr_unique=function (){
3 var len=this.length;
4 var obj={};
5
6 for(var i=0;i<len;i++){
7 var cur=this[i];//当前项
8 obj[cur]=cur;
9 }
10 var list=[];
11 for(key in obj){
12 list.push(obj[key])
13 }
14
15 return list;
16
17 };
18
19 console.log(arr.arr_unique());
对方法三封装成方法
1 var arr=[1,3,5,3,5,3,4,6,2,2,2,1,7,84,34,634];
2 Array.prototype.arr_unique=function (){
3 var obj={};
4 for(var i=0;i<this.length;i++){
5 var cur=arr[i];//当前项
6
7 if(obj[cur]==cur){
8 alert(1111);
9 arr.splice(i,1);
10 i--
11 }else{
12 obj[cur]=cur;
13 }
14 }
15 obj=null;
16 return this;
17 };
18 console.log(arr.arr_unique());