在進行數組操作時往往會遇到去掉重複項的問題,下面簡單介紹下數組去重的方法,以及其執行效率
方法一
採用兩次迴圈
原理:拿當前的和他後面的比,如果後面的有重複的就幹掉
但是我們發現數組最後一項,後面沒有東西,那他就不用和後邊的比較了,所以我們只要迴圈arr.length-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];
for(var i=0;i<arr.length-1;i++){
var curItem=arr[i];//當前項
for(var j=i+1;j<arr.length;j++){
if(curItem==arr[j]){
arr.splice(j,1);
j--;
}
}
}
console.log(arr);
此方法運用了了兩次迴圈,給瀏覽器帶來很大壓力,次數為數組長度的階乘。
所以考慮用對象替代(對象的屬性名稱字不會重複)方法二
var arr=[1,3,5,3,5,3,4,6,2,2,2,1];
var len=arr.length;
var obj={};
for(var i=0;i<len;i++){
var cur=arr[i];//當前項
obj[cur]=cur;
}
var list=[];
for(key in obj){
list.push(obj[key])
}
console.log(list);
此方法執行效率較高,但迴圈使用兩次
採用另一種方法:方法三
原理: 迴圈數組,把數組中的每一項當做obj對象的屬性名稱和屬性值存進來,
但是我們發現如果obj對象中已經存在了這個屬性名稱的話,那就說明數組重複了,那我們重複資料刪除的項
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];
var obj={};
for(var i=0;i<arr.length;i++){
var cur=arr[i];//當前項
if(obj[cur]==cur){
arr.splice(i,1);
i--
}else{
obj[cur]=cur;
}
}
obj=null;
console.log(arr);
此方法也運用兩次迴圈,仔細想想還有運用一次實現去重的方法。
對方法二封裝成方法
var arr=[1,3,5,3,5,3,4,6,2,2,2,1,7,84,34,634];
Array.prototype.arr_unique=function (){
var len=this.length;
var obj={};
for(var i=0;i<len;i++){
var cur=this[i];//當前項
obj[cur]=cur;
}
var list=[];
for(key in obj){
list.push(obj[key])
}
return list;
};
console.log(arr.arr_unique());
對方法三封裝成方法
var arr=[1,3,5,3,5,3,4,6,2,2,2,1,7,84,34,634];
Array.prototype.arr_unique=function (){
var obj={};
for(var i=0;i<this.length;i++){
var cur=arr[i];//當前項
if(obj[cur]==cur){
alert(1111);
arr.splice(i,1);
i--
}else{
obj[cur]=cur;
}
}
obj=null;
return this;
};
console.log(arr.arr_unique());