1. 程式人生 > >js 陣列去重複--通用方法

js 陣列去重複--通用方法

js去重,下面這個程式碼,會有不可描述的bug,臥槽。MMP,我是沒搞懂,這個宣告個方法,怎麼還被jquery還是js的庫方法呼叫了。真實可怕。不要用這個了。不然你也會遇到不可描述的錯誤的。我弄明白了,再更新下文章。

不推薦使用的方法,如下:

Array.prototype.distinct = function (){
    var arr = this,
        result = [],
        len = arr.length;
    for (var i = 0; i < len; i++) {
        var bool = arr.indexOf(arr[i],i+1);  //從傳入引數的下一個索引值開始尋找是否存在重複
        if(bool === -1){
            result.push(arr[i]);
        }
    } 
    return result;
};

大師兄

js去重,然後,不使用呢個Set的,這個跟瀏覽器的版本有關係,不實在,還是簡單點的好。

方法很簡單,可能你還會搜尋到很多種方法,但是,只要記住個簡單到就好了。

我這個地方留個筆記。方便下次使用到時候,直接來自己的文章找就好了。

雖然,上面的方法,在瀏覽器的console裡面測試都是OK的,我在程式碼裡面測試也是OK的,但是他確影響到了我的其他地方的程式碼。出了莫名其妙的bug。最後,各種debug,發現是我的這個方法是罪魁禍首。臥槽。還是用地下的這個吧。

推薦使用的方法,如下:

function myUnique(arr) {
    var obj = {};
    return arr.filter(function(item, index, array){
        return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
    })
}

現在分析一下,上面的不可描述的bug

大師兄

繼續在瀏覽器的console裡面除錯,我聲明瞭個數組,然後,數組裡面有2個值,在後面,使用for迴圈,來操作這個陣列。

可以看到,原來只有2個值的陣列,現在竟然迴圈了三個東西出來。

前2個結果還是預料之中的,但是最後一個,呵呵,臥槽,他怎麼會出現呢。這不我剛剛宣告的陣列嘛。

炸就炸在這了。

這個怎麼解釋呢?

這個去重的方法,實際上是給js的陣列Array這個東西,新添加了個屬性,就是咱的呢個方法名稱。然後,這個Array,陣列,就是個object like,裡面存的就是key 以及value,所以,在上面for迴圈的時候,輸出的就是index,以及index對應的值。

這個for迴圈的寫法,js是支援的,但是,咱給Array這個物件添加了個預設的屬性---咱呢個方法名稱。以及這個key對應的值,就是那個方法體了。這個新新增的屬性,預設是可以迴圈的。

綜上所述,咱還是不使用這個方法了吧。