js中的數組去重問題,被討論都快爛掉了。網上也有不少方法,不過都大同小異,複製來複制去的。
固然這裏不是討論我是否是有什麼新方法了,沒有,只是在實踐的時候發現一些問題,值得拿出來講說!
去重的思路有幾種javascript
1,第一個與後面全部的比較,發現重複的就刪除掉,再取第二個與後面的比較,以此類推!
2,先排序,比較相鄰的。
3,建立臨時數組,原數組一個一個往裏塞,若已存在就不塞了。
4,hash法,根據對象的屬性不存在相同的特色,有點相似方法3。
….前端
固然這些具體代碼網上不少,不一一列舉!下面來探討的是其中被人們忽略的一些問題。java
方法1的代碼以下json
function arrayUnique(arr){ for (var i=0;i‹arr.length;i++){ for (var j=i+1;j‹arr.length-1;j++){ if ( arr[j] === arr[i] ){ arr.splice(j,1); j--; } } } return arr; }
方法4的hash方法以下後端
function arrayUnique2(arr){ var hash = {}; var temp = []; for (var i=0;i‹arr.length;i++){ if ( !hash[arr[i]] ){ hash[arr[i]] = true; temp.push(arr[i]); } } /* for (var prop in hash){ console.log(prop+'----'+typeof(prop)) } */ return temp; }
雖然hash方法擁有很是搞的效率,可是存在一些問題,由於javascript中的數組是能夠存儲任意數據類型的值,就是能夠是數字、字符串、或者數組、對象、函數等等。數組
實際測試中確實能夠去除長得同樣的數組或者對象,好比以下arr中的第四和第五個[1,2]會被去重,但問題來了。函數
var aa = 'aa',bb = 'bb'; var arr = [ 1,'1','abc',[1,2],[1,2],['1','2'],'1,2',['aa','bb'],[aa,bb],document,'[object HTMLDocument]',function (){return 1},function (){return 1;} ] console.log(arrayUnique2(arr));//[1,'abc',[1,2],['aa','bb'],document,function (){return 1},function (){return 1;}]
若是兩個對象的引用不一樣即便長得同樣也不是全等的,這個咱們知道,也能夠說去掉長得相同的兩個元素。測試
因而我將hash對象的屬性跟屬性的數據類型在函數中輸出出來,發現對象屬性或json鍵名的數據類型都是字符串類型的,而且每一個被添加的屬性,會被先隱式調用toString方法,即DOM中的document對象,變成對象的屬性即json的鍵名的時候,隱式調用toString方法,這樣就和'[object HTMLDocument]’是同樣的了,數組去重的話,後面字符串類型的[object HTMLDocument]會被去掉。
code
同理[1,2],[1,2],[‘1′,’2′],’1,2’這四個值都會被認爲是同樣的而被去重。對象
數組最後面的兩個函數,由於在後面的函數里加了個分號,不然也是相同。
因此會有這樣的結論,在使用hash方法的時候,數組元素變成對象屬性名或者json鍵名的時候,數據會先隱式調用toString方法變成字符串,而後成爲對象的屬性。而這樣的後果就是,只要兩個元素各自調用toString方法後的字符串相等,兩個值遍認爲是相同,即便兩個值根本不想等。
因此這種hash去重的方法有侷限性,即在去除全部值的數據類型相同的狀況下,他是效率很高很好用,可是數據類型不一樣的狀況下。仍是老老實實用其餘方法比較吧。(固然通常後端傳到前端的數據,數據類型通常都是相同的。)
以上就是我對去重中遇到問題的一些思考,但願對你們有幫助,網上的東西,不能盲目拿來就用,要有本身的思考。