整理一波數組去重方法
阿新 • • 發佈:2018-04-04
=== uniq div 鍵值 clas 判斷 .com targe .org
關於數組去重,一直用的是循環,還有es6的set,查閱資料竟有如此多的去重方法,整理了如下。直接上幹貨
循環1
function unique(arr) { var newArr = []; var isRepeat; for(var i=0; i<arr.length; i++) { isRepeat = false; for(var j=i+1; j<arr.length; j++) { if(arr[i] === arr[j]){ isRepeat = true;break; } } if(!isRepeat){ newArr.push(arr[i]); } } return newArr; } var arr = [5,6,1,8,1,6]; console.log(unique(arr));
循環2
var newArr = []; for(var i=0; i<arr.length; i++){ for(var j=i+1; j<arr.length; j++){ if(arr[i] === arr[j]){ j= ++i; } } newArr.push(arr[i]); } return newArr; } var arr = [5,6,1,8,1,6]; console.log(unique(arr));
foreach方法
遍歷傳入的數組元素,如果新數組中沒有這個元素,就push進去新數組
function unique(arr) {
var newArr = [];
arr.forEach(function(item){
if(newArr.indexOf(item) === -1){
newArr.push(item);
}
});
return newArr;
}
var arr = [5,6,1,8,1,6];
console.log(unique(arr));
filter方法
item 表示數組中的每個元素,index 是每個元素的出現位置。indexOf 返回匹的第一個索引。function unique(arr) { return arr.filter(function(item, index){ return arr.indexOf(item) === index; }); }
sort方法
先排序,再比較相鄰的是否相同,不同就push進去新數組
function unique(arr) { var newArr = []; arr.sort(); for(var i = 0; i < arr.length; i++){ if( arr[i] !== arr[i+1]){ newArr.push(arr[i]); } } return newArr; } var arr = [5,6,1,8,1,6]; console.log(unique(arr));
sort方法2
對數組排序,將第一個元素push進去新數組,再將每個要放進入的元素與新數組的最後一個元素比較,不同就push
function unique(arr) { var newArr = []; arr.sort(); var newArr = [arr[0]]; for(var i = 1; i < arr.length; i++){ if(arr[i] !== newArr[newArr.length - 1]){ newArr.push(arr[i]); } } return newArr; } var arr = [5,6,1,8,1,6]; console.log(unique(arr));
對象
將數組值作為對象的屬性,如果重復了就不賦值。
function unique(arr) { var newArr = []; var tmp = {}; for(var i=0; i<arr.length; i++){ if(!tmp[arr[i]]){ tmp[arr[i]] = 1; newArr.push(arr[i]); } } return newArr; } var arr = [5,6,1,8,1,6]; console.log(unique(arr));
但是要註意這個方法不能應對所有情況
1. 無法區分隱式類型轉換成字符串後一樣的值,比如 1 和 ‘1‘ 。
2 .無法處理復雜數據類型,比如對象(因為對象作為 key 會變成 [object Object] )。
3. 特殊數據,比如 ‘__proto__‘ ,因為 tmp 對象的 __proto__ 屬性無法被重寫。
對象的升級1
function unique(arr) { var newArr = []; var tmp = {}; var tmpKey; for(var i=0; i<arr.length; i++){ tmpKey = typeof arr[i] + arr[i]; console.log(tmpKey); if(!tmp[tmpKey]){ tmp[tmpKey] = 1; newArr.push(arr[i]); } } return newArr; } var arr = [5,6,‘1‘,8,1,6]; console.log(unique(arr));
對象升級2
function unique(arr) { var newArr = []; var tmp = {}; var tmpKey; for(var i=0; i<arr.length; i++){ tmpKey = typeof arr[i] + JSON.stringify(arr[i]); console.log(tmpKey) if(!tmp[tmpKey]){ tmp[tmpKey] = 1; newArr.push(arr[i]); } } return newArr; } var arr = [5,6,1,8,1,6]; console.log(unique(arr));
es6 map
Map 是一種新的數據類型,也是鍵值對的集合,但是“鍵”的範圍不限於字符串,各種類型的值(包括對象)都可以當作鍵。
function unique(arr) { var newArr = []; var tmp = new Map(); for(var i=0; i<arr.length; i++){ if(!tmp.get(arr[i])){ tmp.set(arr[i], 1); newArr.push(arr[i]); } } return newArr; } var arr = [5,6,1,8,1,6]; console.log(unique(arr));
es6 set
Array.from()
方法從一個類似數組或可叠代對象中創建一個新的數組實例。
function unique(arr){ var set = new Set(arr); return Array.from(set); } var arr = [5,6,1,8,1,6]; console.log(unique(arr));
includes()方法
includes()方法用來判斷一個數組是否包含一個指定的值,根據情況,如果包含則返回 true,否則返回false。
function unique(arr) { var newArr = []; arr.forEach(function(item){ if(!newArr.includes(item)){ newArr.push(item); } }); return newArr; } var arr = [5,6,1,8,1,6]; console.log(unique(arr));
整理一波數組去重方法