JS數組去重方法的比較

Paste_Image.png

直接上代碼,代碼注釋詳細

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>demo4</title>
    <style>
        .g{
            background-color: green;
            height:5px;
            display:inline-block;
        }
    </style>
</head>
<body>
    <div>
        <div id="unique1">
            <label>unique1</label>
            <div class="g"></div>
        </div>
        <div id="unique2">
            <label>unique2</label>
            <div class="g"></div>
        </div>
        <div id="unique3">
            <label>unique3</label>
            <div class="g"></div>
        </div>
        <div id="unique4">
            <label>unique4</label>
            <div class="g"></div>
        </div>
    </div>
    <script>

    Array.prototype.unique1 = 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;
    }
    Array.prototype.unique2 = 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.unique3 = 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;
    }

    Array.prototype.unique4 = function(){
        //數組排序
        this.sort();
        var re = [ this[ 0 ] ];
        for( var i = 1; i < this.length; i++ )
        {
            //取數組的第i項和臨時數組的最后一項目對比,如果不等,就存入臨時數組。
            if( this[ i ] !== re[ re.length - 1 ] )
            {
                re.push( this[ i ] );
            }
        }
        return re;
    }

    //隨機生成數組
    function randomArr(num){
        var arr = [];
        for( var i = 0; i < num; i++ )
        {
            //隨機生成1-num之間的數字
            arr.push( Math.floor( Math.random() * num ) + 1 );
        }
        return arr;
    }

    function cuttime(idname){
        var sTime = new Date().getTime();
        //調用數組去重的方法
        arr[idname]&&arr[idname]();
        var eTime = new Date().getTime();
        var _time = eTime-sTime;
        //改變橫條的長度
        document.getElementById(idname).children[1].style.width = _time+"px";
    }

    //隨機生成1-10000的數字的數組
    var arr = randomArr(10000);

    cuttime("unique1");
    cuttime("unique2");
    cuttime("unique3");
    cuttime("unique4");


    </script>
</body>
</html>

總結:結果表明第二種方法遠遠快于其他兩種方法。 但是內存占用方面應該第二種方法比較多,因為多了一個hash表。這就是所謂的空間換時間。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容