第一種是比較常規的方法json
思路:數組
1.構建一個新的數組存放結果函數
2.for循環中每次從原數組中取出一個元素,用這個元素循環與結果數組對比this
3.若結果數組中沒有該元素,則存到結果數組中spa
Array.prototype.unique1 = function(){
//這裏要說的是,爲數組的原生方法添加新的方法,即原型屬性中添加新的方法須要prototype,Array()是構造函數,Array prototype是原型屬性,原型屬性中包含實例中共享的屬性和方法
var res = [this[0]];
//上邊這一句就是從要被比較的數組中拿出第一個數複製給新數組,方便下面比較 for(var i = 1; i < this.length; i++){ var repeat = false;
//這塊不難理解 for(var j = 0; j < res.length; j++){
//這個for循環是以新建res數組創建的循環,在首次執行的時候只有this【0】 if(this[i] == res[j]){
//根據循環次數也就是i的值取不一樣的【數】來進行比較 repeat = true; break;
//當兩個數相等就跳出循環 } } if(!repeat){ res.push(this[i]);
//!repeat就是true,就將this【i】添加到res數組中 } } return res;
//返回res } var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0] alert(arr.unique1());
第二種方法比上面的方法效率要高prototype
思路:code
1.先將原數組進行排序對象
2.檢查原數組中的第i個元素 與 結果數組中的最後一個元素是否相同,由於已經排序,因此重複元素會在相鄰位置blog
3.若是不相同,則將該元素存入結果數組中排序
Array.prototype.unique2 = function(){ this.sort(); //先排序
//sort()方法會調用每個數組項的toString()轉型方法,而後比較獲得的字符串。。該方法也能夠接受一個比較函數做爲參數
var res = [this[0]];
//新建一個數組將原數組排序後的第一個數組項複製給新數組 for(var i = 1; i < this.length; i++){ if(this[i] !== res[res.length - 1]){
//若是當前循環的這個原數組項不等於新數組的項就將其添加到新數組中(因此說新數組每次循環長度均可能變化) res.push(this[i]); } } return res; } var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0] alert(arr.unique2());
//原答主說要比第一個方法效率高:第一種方法須要原數組和新數組同時循環比較即每一個值都須要對新數組循環比較一次,而第二種方法由於排序事後已知後比較的值必定不會小於上一個值,因此只須要循環原數組進行比較便可
第二種方法也會有必定的侷限性,由於在去重前進行了排序,因此最後返回的去重結果也是排序後的。若是要求不改變數組的順序去重,那這種方法便不可取了。
第三種方法(推薦使用)
思路:
1.建立一個新的數組存放結果
2.建立一個空對象
3.for循環時,每次取出一個元素與對象進行對比,若是這個元素不重複,則把它存放到結果數組中,同時把這個元素的內容做爲對象的一個屬性,並賦值爲1,存入到第2步創建的對象中。
說明:至於如何對比,就是每次從原數組中取出一個元素,而後到對象中去訪問這個屬性,若是能訪問到值,則說明重複。
Array.prototype.unique3 = function(){
var res = [];
//新建了一個數組 var json = {};
//新建了一個對象 for(var i = 0; i < this.length; i++){ if(!json[this[i]]){
//在這個對象裏訪問不到的對象屬性就會被添加到新建的數組res和新建的對象json中
//這個比較方法很好,把不重複的數組項以屬性‘name’的形式添加到json對象中,同時第一次執行時json中沒有任何屬性 res.push(this[i]); json[this[i]] = 1;
//被添加的對象屬性會被賦值爲1 } } return res; } var arr = [112,112,34,'你好',112,112,34,'你好','str','str1']; alert(arr.unique3());