晚上無事,偶然看到這麼個小測試,拿來寫一寫,但願你們提建議;數組
直接上代碼:測試
1 Array.prototype.unique = function (isStrict) { 2 if (this.length < 2) 3 return [this[0]] || []; 4 var tempObj = {}, newArr = []; 5 for (var i = 0; i < this.length; i++) { 6 var v = this[i]; 7 var condition = isStrict ? (typeof tempObj[v] != typeof v) : false; 8 if ((typeof tempObj[v] == "undefined") || condition) { 9 tempObj[v] = v; 10 newArr.push(v); 11 } 12 } 13 return newArr; 14 }
驗證:
var arr = ["9", 9, 1, 3, 8, 7, 7, 6, 6, 5, 7, 8, 8, 7, 4, 3, 1, 22, 22, 'a', 'a','bcd', 'abc', 'bcd'];
var newArr = arr.unique(true);
alert(newArr.join(","));//嚴格模式:9,9,1,3,8,7,6,5,4,22,a,bcd,abc,將其中"9",9認爲不一樣
var newArr = arr.unique();
alert(newArr.join(","));//普通模式:9,1,3,8,7,6,5,4,22,a,bcd,abc,將其中"9",9認爲相同
注意:this
一、使用臨時對象tempObj,將數組的值做爲對象的鍵值,遍歷數組時對當前值根據對象鍵值判斷,不存在就將這個數組的值push到新數組中。提升效率spa
二、使用類型判斷,若是當前數組值作爲對象鍵,所對應的對象值類型與當前值類型一致,則能夠根據參數(isStirct嚴格模式)決定是否去重,true表示嚴格,對於字符爲22,或數字爲22都認爲同樣,不然保留prototype
看了一下JavaScript高級程序設計中關於數組的操做,又想到種更簡單的去重方法,代碼以下:設計
1 Array.prototype.unique = function () { 2 var newArr = []; 3 for (var i = 0; i < this.length; i++) { 4 if (newArr.indexOf(this[i]) == -1) { 5 newArr.push(this[i]); 6 } 7 } 8 return newArr; 9 } 10 var arr = ['a','b',1,4,5,8,4,3,1,'a','1']; 11 alert(arr.unique());//a,b,1,4,5,8,3,1 indexOf默認調用===,所以將1與'1'認爲是不一樣