js--數組hash法去重引起的json鍵名的思考

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去重的方法有侷限性,即在去除全部值的數據類型相同的狀況下,他是效率很高很好用,可是數據類型不一樣的狀況下。仍是老老實實用其餘方法比較吧。(固然通常後端傳到前端的數據,數據類型通常都是相同的。)

以上就是我對去重中遇到問題的一些思考,但願對你們有幫助,網上的東西,不能盲目拿來就用,要有本身的思考。

相關文章
相關標籤/搜索