數組去重
- 第一種方法:
- 先對數組進行排序
sort()
,排好序,然后把數組的當前項和后一項進行比較,相同則使用數組的splice(相同的位置,1)
,但是為了防止數組塌陷,每次刪除數組元素的時候要把i
的值減一。
var ary=[1,23,4,2,33,1,2,44,3,2,3]ary.sort(function(a,b){return a-b;});//返回的是排好序的數組for(var i=0;i<ary.length;i++){if(ary[i]===ary[i+1]){ary.splice(i,1);i--;//為了防止數組塌陷}}
- 第二種方法是:建立一個新數組,要是原數組里面的數是頭一次出現(使用數組的
indexOf()
),那么就把這個數放到新數組里面,否者就拋棄這個數,類似于前面說的隨機驗證碼
var ary=[1,23,4,2,33,1,2,44,3,2,3]var arr2=[];
for(var i=0;i<ary.length;i++){
if(arr2.indexOf(art[i])==-1){
arr2.push(ary[i]);
}
}
- 第三種方法:直接拿當前項與后一項進行比較,相同的要刪除,使用數組
splice()
進行刪除,這里也要防止數組塌陷;
var ary=[1,23,4,2,33,1,2,44,3,2,3]
for(var i=0;i<ary.length;i++){
for(var j=i+1;j<ary.length;j++){if(ary[i]===ary[j]){
ary.splice(j,1);
j--;
}
}
}
- 第四種方法:利用對象不重名的特性,對象的存儲是鍵值對方式,要獲取屬性值,要通過對象
./[]
屬性來獲取;相同則刪除,也要防止數組塌陷
var ary=[1,23,4,2,33,1,2,44,3,2,3]
//新建一個對象
var obj={};
for(var i=0;i<ary.length;i++){
var cur=ary[i];
//如果obj【cur】為真,那就說明對象里面找到了這個數,重復了
if(obj[cur]){
ary.splice(i,1);
i--;
}else{
//給對象賦值 說明obj.xxx=undefined 不存在為假
obj[cur]=cur;//obj【1】=1;
}
}
- 第五種方法:也是利用對象不重名的方法,但是這次是直接計算其數組各個數的重復次數,
var ary=[1,23,4,2,33,1,2,44,3,2,3]
var obj={};
for(var i=0;i<ary.length;i++){var cur=ary[i];if(obj[cur]){//每次重復一次,其對應的值加一obj[cur]++;
}else{
//說明沒有重復,個數只有一個
obj[cur]=1;
}
}
var ary2=[];
//對于對象使用in 方法進行遍歷,遍歷獲取的是屬性值
for(var attr in obj){ary2.push(Number(attr));
}
- 第六種方法:使用ES6中的Set數據結構中重復項不生效的特性
let arr = [1,2,3,3,2,4,5];let list = new Set(arr);console.log("list",list); // 1,2,3,4,5
但是對于數據的數據類型是不會進行轉換的,所以一定要注意元素的數據類型是否是一致
數組去重的面試題:
找出這次考試中,最高分,及最高分出現的次數
//思路:全部人的成績是一個數組,這就相當于使用數組去重的方法,找到最高的分數,和其次數,首先找到了去重的數組進行從小到大的排序,得到次數,然后通過最高分所對應的索引值得到出現的最高分var ary = [1, 23, 4, 2, 33, 1, 2, 44, 3, 2, 3];var obj = {};for(var i = 0; i < ary.length; i++) {//把數組的值,當作對象的索引賦值給對象,所以通過對象索引獲取的是數組出現的次數var cur = ary[i];if(obj[cur]) {//每次重復一次,其對應的值加一obj[cur]++;} else {//說明沒有重復,個數只有一個obj[cur] = 1;}}//分數從低到高出現的次數console.log(obj);var ary2 = [];//對于對象使用in 方法進行遍歷,遍歷獲取的是屬性值for(var attr in obj) {ary2.push(Number(attr));}console.log(ary2);//最高分console.log(ary2[ary2.length-1]);var count=ary2[ary2.length-1];//最高分出現的次數console.log(obj[count]);