1、遍歷數組法
建立一個新數組,然后循環遍歷要去重的數組,每次判斷新數組不包含舊數組的值時(新數組用indexOf方法檢索舊數組的值返回結果等於-1)將該值加入新數組。
let oldArr = [1, 2, 3, 4, 5, 5 , 6, 7, 8, 2, 3];
let newArr = unique(oldArr);
function unique(arr){
let hash=[];
for (let i = 0; i < arr.length; i++) {
if(hash.indexOf(arr[i]) === -1){
hash.push(arr[i]);
}
}
return hash;
}
2、數組下標判斷法
與第一種方法類似,先遍歷,然后判斷當前數組的第i項在數組中第一次出現的位置是否與i相等,不是則說明重復,忽略,不加入新數組。
let oldArr = [1, 2, 3, 4, 5, 5 , 6, 7, 8, 2, 3];
let newArr = unique(oldArr);
function unique(arr){
let hash=[];
for (let i = 0; i < arr.length; i++) {
if(arr.indexOf(arr[i]) === i){
hash.push(arr[i]);
}
}
return hash;
}
3、排序后判斷
對數組進行排序后,將新數組的最后一個值與舊數組的當前值進行比較,如果相等說明重復,不相等則添加至新數組。
function unique(arr){
arr.sort();
let hash = [arr[0]];
for (let i = 1; i < arr.length; i++) {
if (arr[i] != hash[hash.length-1]) {
hash.push(arr[i]);
}
}
return hash;
}
4、es6的Set去重
Set類型:ES6提供了新的數據結構Set。它類似於數組,但是成員的值都是唯一的,沒有重復的值。
Set本身是一個構造函數,用來生成Set數據結構。
所以我們可以直接用Set來處理數組,但是處理完后可以用Array.form方法或者擴展函數把它重新轉回數組,不然得到的是Set類型,對於一些有類型判斷的地方是不通過的。
4.1、 Array.from轉換Set類型為Array
let oldArr = [1, 2, 3, 4, 5, 5 , 6, 7, 8, 2, 3];
let newArr = new Set(oldArr);
console.log(newArr);
console.log(newArr instanceof Array); // 此時是Set類型,不是Array
newArr = Array.from(newArr);
console.log(newArr instanceof Array);
4.2、 擴展函數轉換Set類型為Array
let oldArr = [1, 2, 3, 4, 5, 5 , 6, 7, 8, 2, 3];
let newArr = [...new Set(oldArr)]; // 這個方法最簡便