在實際工作或面試中,我們經(jīng)常會遇到“數(shù)組去重”問題容客,接下來是我總結(jié)的一些實現(xiàn)的數(shù)組去重的多種方法:
1.將數(shù)組的每一個元素依次與其他元素做比較凛驮,發(fā)現(xiàn)重復元素棒假,利用數(shù)組方法splice()刪除重復元素
var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5,5,5,5];
function norepeat(arr) {
for(var i = 0; i < arr.length-1; i++){
for(var j = i+1; j < arr.length; j++){
if(arr[i]==arr[j]){
arr.splice(j,1);
j--;
}
}
}
return arr;
}
var arr2 = norepeat(arr);
console.log(arr2); //[1, 23, 3, 5, 6, 7, 9, 8]
2.使用雙層循環(huán)改變原數(shù)組
// var arr = [1,1,2,2,3,3,4,4,5,5,4,3,1,2,6,6,6,6];
// console.log(arr);
// function norepeat(arr){
// for(var i=0;i<arr.length;i++){
// for(var j=0;j<arr.length;j++){
// if(arr[i] == arr[j] && i !=j){
// arr.splice(j,1);
// }
// }
// }
// return arr;
// }
// var arr2=norepeat(arr);
// console.log(arr2); //[1, 2, 3, 4, 5, 6]
3.借助新數(shù)組,判斷新數(shù)組中是否存在該元素如果不存在則將此元素添加到新數(shù)組中(原數(shù)組長度不變但被按字符串順序排序)
// var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5];
// console.log(arr);
// function norepeat(arr){
// var temp=[];
// var end; //臨時變量用于對比重復元素
// arr.sort();
// end=arr[0];
// temp.push(arr[0]);
// for(var i=1;i<arr.length;i++){
// if(arr[i] !=end){ //當前元素如果和臨時元素不等則將此元素添加到新數(shù)組中
// temp.push(arr[i])
// end=arr[i]
// }
// }
// return temp;
// }
// var arr2=norepeat(arr);
// console.log(arr2); //[1, 23, 3, 5, 6, 7, 8, 9]
4.創(chuàng)建一個新數(shù)組烂瘫,判斷新數(shù)組中是否存在該元素如果不存在則將此元素添加到新數(shù)組中
// var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5];
// console.log(arr);
// function norepeat(arr){
// var temp =[];
// for(var i=0;i<arr.length;i++){
// if(temp.indexOf(arr[i]) == -1){
// temp.push(arr[i]);
// }
// }
// return temp;
// }
// var arr2=norepeat(arr);
// console.log(arr2);//[1, 23, 3, 5, 6, 7, 9, 8]
5.借助indexOf()方法判斷此元素在該數(shù)組中首次出現(xiàn)的位置下標與循環(huán)的下標是否相等
var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5,5,5];
console.log(arr);
function norepeat(arr) {
for (var i = 0; i < arr.length; i++) {
if (arr.indexOf(arr[i]) != i) {
arr.splice(i,1);//刪除數(shù)組元素后數(shù)組長度減1后面的元素前移
i--;//數(shù)組下標回退
}
}
return arr;
}
var arr2 = norepeat(arr);
console.log(arr2); //[1, 23, 3, 5, 6, 7, 9, 8]
6.創(chuàng)建一個新數(shù)組 通過indexOf方判斷當前元素在數(shù)組中的索引如果與循環(huán)的下標相等則添加到新數(shù)組中
var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5,5,5];
console.log(arr);
function norepeat(arr){
var temp=[];
for(var i=0;i<arr.length;i++){
if(arr.indexOf(arr[i]) == i){
temp.push(arr[i]);
}
}
return temp;
}
var arr2=norepeat(arr);
console.log(arr2); //[1, 23, 3, 5, 6, 7, 9, 8]
7.利用數(shù)組中的filter方法
var arr = ["apple","banana","pear","apple","orange","orange"];
console.log(arr);
var arr2 =arr.filter(function(value,index,self){
return self.indexOf(value) ===index;
});
console.log(arr2); //["apple", "banana", "pear", "orange"]
8.利用空對象來記錄新數(shù)組中已經(jīng)存儲過的元素
// var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5,5,5];
// console.log(arr);
// var obj={};
// var arr2=[];
// for(var i=0;i<arr.length;i++){
// if(!obj[arr[i]]){
// obj[arr[i]]=true;
// arr2.push(arr[i]);
// }
// }
// console.log(arr2); //[1, 23, 3, 5, 6, 7, 9, 8]
9.借助兩個新數(shù)組
// var arr = [1,1,2,2,3,3,4,4,5,5,4,3,2,1,1,1];
// console.log(arr);
// var arr2=[];
// for(var i=0;i<arr.length;i++){
// var arr3=[]; //接收重復數(shù)據(jù)后面的下標
// //內(nèi)層循環(huán)找出有重復數(shù)據(jù)的下標
// for( var j=i+1;j<arr.length;j++){
// if(arr[i] == arr[j]){
// arr3.push(j); //找出后面重復數(shù)據(jù)的下標
// }
// }
// // console.log(arr3);
// if(arr3.length == 0){ //若重復數(shù)組沒有值說明其不是重復數(shù)據(jù)
// arr2.push(arr[i]);
// }
// }
// console.log(arr2); //[5, 4, 3, 2, 1]
10.此方法沒有借助新數(shù)組直接改變原數(shù)組,并且去重后的數(shù)組被排序
// var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5];
// console.log(arr);
// function norepeat(arr){
// var temp;
// arr.sort();
// temp=arr[0];
// for(var i=1;i<arr.length;i++){
// if(arr[i]==temp){ //當前元素如果和臨時元素相等則將此元素從數(shù)組中刪除
// arr.splice(i,1);
// i--;
// }else{
// temp=arr[i];
// }
// }
// return arr;
// }
// var arr2=norepeat(arr);
// console.log(arr2); //[1, 23, 3, 5, 6, 7, 8, 9]
數(shù)組去重的方法其實不難媒熊,但是思路卻是特別重要。以上是我所知道的一些方法坟比,如果有錯或者更好方法可以分享出來芦鳍,謝謝。