js去除數組重復項


第一次寫,感覺不知道寫啥,想了半天決定還是用以前用過的一些東西,看了看就寫數組去除重復項算了^_^。

去除數組重復項有很多方法,之前因為用到,看了一下以前搜集的一些代碼,進行比較,在這里總結一下,希望能給各位有所幫助,有什么問題,請各位大神不吝指導。

      方法一:

//兩個for循環
    Array.prototype.delRepeat1 = function () {
        var r = new Array();
        label: for (var i = 0, n = this.length; i < n; i++) {
            for (var x = 0, y = r.length; x < y; x++) {
                if (r[x] == this[i]) {
                    continue label;
                }
            }
            r[r.length] = this[i];
        }
        return r;
    }

這是我最先接觸到的去重,相信很多人也是最先接觸這個方法,這種方法運行時用到的循環太多了,效率太低,如果數據量少還行,如果是大量數據的話,那就只能說呵呵了。

方法二:

Array.prototype.delRepeat2 = function () {
        this.sort();//排序
        var n = [this[0]];
        for (var i = 1; i < this.length; i++) {
            if (this[i] !== n[n.length - 1]) {
                n.push(this[i]);
            }
        }
        return n;
    }

 

這種是我比較喜歡用的,效率也不錯,先用sort排序,加一個臨時數組,然后循環遍歷,將去重的數組和臨時數組末進行比較,不同就加入臨時數組。

方法三:

 Array.prototype.delRepeat3 = function () {
        var n = []; //一個新的臨時數組
        for (var i = 0; i < this.length; i++) //遍歷當前數組
        {
            //如果當前數組的第i在臨時數組有,跳過,否則把當前項push到臨時數組里
            if (n.indexOf(this[i]) == -1) n.push(this[i]);
        }
        return n;
    }

方法三雖然只有一個for循環,但indexof函數會從頭檢索n數組,同樣效率不行。

方法四:

Array.prototype.delRepeat4 = function () {
        var n = {}, r = []; //n為hash表,r為臨時數組
        for (var i = 0; i < this.length; i++) //遍歷當前數組
        {
            if (!n[this[i]]) //如果hash表中沒有當前項
            {
                n[this[i]] = true; //存入hash表
                r.push(this[i]); //把當前數組的當前項push到臨時數組里面
            }
        }
        return r;
    }

這種方法去重效率很快,但是有個很大的缺點,就是內存占用多。不推薦使用。

方法五:

Array.prototype.delRepeat5 = function () {
        var n = [this[0]]; //結果數組
        for (var i = 1; i < this.length; i++) //從第二項開始遍歷
        {
            //如果當前數組的第i項在當前數組中第一次出現的位置不是i,
            //那么表示第i項是重復的,忽略掉。否則存入結果數組
            if (this.indexOf(this[i]) == i) n.push(this[i]);
        }
        return n;
    }

這種方法和方法三一樣用到了indexof。

方法六:

Array.prototype.delRepeat6 = function () {
        return this.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g, "$1$2$4").replace(/,,+/g, ",").replace(/,$/, "").split(",");
    }

這個不用說,用了正則,o(╯□╰)o,感覺好復雜,我也沒懂Σ( ° △ °|||)︴。

方法七:

 Array.prototype.delRepeat7 = function () {
        var temp = {}, len = this.length;
        for (var i = 0; i < len; i++) {
            var tmp = this[i];
            if (!temp.hasOwnProperty(tmp)) {//hasOwnProperty用來判斷一個對象是否有你給出名稱的屬性或對象
                temp[this[i]] = "yes";
            }
        }

        len = 0;
        var tempArr = [];
        for (var i in temp) {
            tempArr[len++] = i;
        }
        return tempArr;
    }

這你是用到了hasOwnProperty,這種效率也不錯.

 

下面是我的測試代碼:

function delRepeatExample () {
        var arr = [];//測試的數組
        for (var i = 0; i < 10000; i++) {
            var t = parseInt(Math.random() * 1000);
            arr[i] = (t.toString());
        }
        var s = new Date();//定義開始的時間!
       var a=arr.delRepeat();

        var dd = new Date() - s;//執行時間=當前時間-開始的時間
    }

分別測試了10000和100000長的數組,測試結果如下:

方法一:  242ms(10000長度的)     2240ms(100000長度的)

方法二:  6ms                               39ms

方法三:  255ms                            2138ms

方法四:  4ms                                19ms

方法五:  416ms                             4492ms

方法六:  9ms                                 50ms

方法七:  2ms                                 8ms

我個人比較傾向於方法二、方法七。

不多說了,就這樣吧....


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM