建立一個空的新數組,依次檢查舊數組的值是否存在於新數組中,若是不存在就push進去。主要用到數組的indexOf方法。數組
function arrUnique(arr){ var newArr = []; for (i = 0; i < arr.length; i++){ if (newArr.indexOf(arr[i]) == -1){ newArr.push(arr[i]); } } return newArr; } var arr = [1,2,3,4,5,3,2]; console.log(arrUnique(arr));
經過將舊數組的值分別賦值給對象的屬性,因爲對象屬性賦值時舊屬性會被新的同名屬性覆蓋,因此保證了數組(屬性)的單一性,最後經過for in將這些屬性push到新數組中。數據結構
function arrUnique(arr){ var obj = {}; var newArr = []; arr.map(function(item){ obj[item] = null; }) for (var key in obj){ newArr.push(Number(key)); } return newArr; } var arr = [1,2,3,4,5,3,2]; console.log(arrUnique(arr));
建立一個空數組和空對象,檢查舊數組的值是否做爲對象的屬性存在,若是不存在就給這個對象添加數組值屬性,屬性值爲1,而且把這個數組的值賦值給新數組。利用的原理仍是對象屬性值會被覆蓋,也就是說是惟一的。下標的引用要比用indexOf搜索數組快的多,因此該方法方法2快。此處的對象實際上是一個哈希表,雖然速度快不少,可是內存佔用較大,也就是以空間換時間。code
function arrUnique(arr){ var newArr = []; var obj = {}; for (var i = 0; i < arr.length; i++){ if (!obj[arr[i]]){ newArr.push(arr[i]); obj[arr[i]]=1; } } return newArr; } var arr = [1,2,3,4,5,3,2]; console.log(arrUnique(arr));
先對原數組排序,而後判斷數組元素是否在新數組的最後一位,若是不是就push進去。這種方法比單純循環要快不少,雖然沒有哈希表方式快,可是不佔用較大空間。對象
function arrUnique(arr){ arr.sort();//快排 var newArr = []; for(var i = 0; i < arr.length; i++){ if (arr[i] !== newArr[newArr.length - 1]){ newArr.push(arr[i]); } } return newArr; } var arr = [1,2,3,4,5,3,2]; console.log(arrUnique(arr));
昨天發佈該文以後,今天收到評論區 亦秋 的反饋,給出了兩種很簡潔的ES6去重方式。
1)第一種方式是判斷數組中的第一索引號等於參數索引號,通常來講,若是數組元素重複,除第一個元素外,全部重複元素的索引和該元素對應的第一索引是不一樣的。該處第一索引是指自左向右搜索到的第一個元素的索引號。排序
[1,2,3,4,5,3,2].filter((value, index, array) => array.indexOf(value) === index)
2)經過ES6的Set數據結構,該結構相似於數組,可是不會出現重複元素,所以,只要基於原始數組建立Set結構,而後在數組內部展開就成了單一元素數組。索引
[...new Set([1,2,3,4,5,3,2])]