關於數組去重,一直用的是循環,還有es6的set,查閱資料竟有如此多的去重方法,整理了以下。直接上乾貨javascript
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));
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));
遍歷傳入的數組元素,若是新數組中沒有這個元素,就push進去新數組java
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));
function unique(arr) { return arr.filter(function(item, index){ return arr.indexOf(item) === index; }); }
先排序,再比較相鄰的是否相同,不一樣就push進去新數組es6
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));
對數組排序,將第一個元素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));
將數組值做爲對象的屬性,若是重複了就不賦值。spa
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));
可是要注意這個方法不能應對全部狀況code
1. 沒法區分隱式類型轉換成字符串後同樣的值,好比 1 和 '1' 。對象
2 .沒法處理複雜數據類型,好比對象(由於對象做爲 key 會變成 [object Object] )。blog
3. 特殊數據,好比 '__proto__' ,由於 tmp 對象的 __proto__ 屬性沒法被重寫。排序
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));
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));
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));
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()方法用來判斷一個數組是否包含一個指定的值,根據狀況,若是包含則返回 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));