javascript數組 去重

  數組去重的方法有不少,到底哪一種是最理想的,本身不清楚。因而本身測試了下數組去重的效果和性能。測試十萬個數據,代碼和所耗大概時間以下。javascript

  到底採用哪一種方法,根據實際狀況而定吧。php

 

/*方法一: 1,'1' 會被認爲是相同的; 全部hash對象,如:{x;1},{y:1}會被認爲是相同的 //10ms */
Array.prototype.unique=function(){
    var newArr=[],obj={};
    for(var i=0,len=this.length;i<len;i++){
        if(!obj[this[i]]){ 
            newArr.push(this[i]);
            obj[this[i]]=true;
        }
    }
    return newArr;
}

/*方法一改進版:全部hash對象,如:{x;1},{y:1}會被認爲是相同的  //30ms*/
Array.prototype.unique=function(){
    var newArr=[],obj={};
    for(var i=0,len=this.length;i<len;i++){
        if(!obj[typeof(this[i])+this[i]]){ 
            newArr.push(this[i]);
            obj[typeof(this[i])+this[i]]=this[i];
        }
    }
    return newArr;
}

/*方法二: 去重結果最好,但耗性能     //250ms*/
Array.prototype.unique=function(){
    var newArr=this.concat();
    for(var i=0,len=newArr.length;i<len;i++) {
        for(var j=i+1,len=newArr.length;j<len;j++) {
            //注意 ===
            if(newArr[i]===newArr[j]) {
                newArr.splice(j,1);
                j--;
            }
        }
    }
    return newArr;
}

/*方法三:  不能去重hash對象  //25ms */
Array.prototype.unique = function(){
    var newArr = []; //一個新的臨時數組
    for(var i = 0,len=this.length; i < len; i++){        
        if (newArr.indexOf(this[i]) == -1){    //若是當前數組的第i已經保存進了臨時數組,那麼跳過,不然把當前項push到臨時數組裏面
            newArr.push(this[i]);
        }
    }
    return newArr;
}


var arr0=[11,21,221,13,24,"134","1",{x:1,y:1},{name:"pobaby",age:"12",hobby:"football"},{name:"pobaby1",age:"121",hobby:"football1"},{x:134},{y:132},{x:143},{y:3421},"神祕人物", "火柴人技巧格鬥", "超音速戰場", "小小辛打磚塊", "火柴人技巧格鬥", "加菲貓超人", "小小辛打磚塊", "卑鄙的我2", "電流導線", "飛天手推車","神D祕人物", "火柴人S技巧格鬥", "超音SD速戰場", "小小SD辛打磚塊", "火柴人SD技巧格鬥", "加菲S貓超人", "小小DF辛打磚塊", "卑鄙的FS我2", "電D流導線", "飛天SD手推車","神祕SD人物", "火柴人技D巧格鬥", "超音ASD速戰場", "小小辛打SAD磚塊", "火柴人技SD巧格鬥", "加菲FDS貓超人", "小小辛打SDF磚塊", "卑鄙SDF的我2", "電流SDF導線", "飛天手DF推車","神祕SD人物", "火柴人技AS巧格鬥", "超音速戰FS場", "小小辛SDF打磚塊", "火柴人SDF技巧格鬥", "加菲SD貓超人",113,231,2221,123,234,"1334","21",{x:13,y:132},{name:"pobaby2",age:"122",hobby:"football2"},{name:"pobaby13",age:"1231",hobby:"football41"},{x:13544},{y:1352},{x:14543},{y:34521},"神祕人sd物", "火柴人技sd巧格鬥", "超音速sd戰場", "小小辛sd打磚塊", "火柴人技巧gw格鬥", "加菲貓ui超人", "小小辛yi打磚塊", "卑鄙的yi我2", "電流yt導線", "飛天手ytui推車","神Dyu祕人物", "火yui柴人S技yui巧格鬥", "超音SDyu速戰場", "小小SD辛打磚uyi塊", "火柴yui人SD技巧格鬥", "加yui菲S貓超人", "小小DF辛打磚ui塊", "卑鄙uyi的FS我2", "電D流導yui線", "飛天SD手推uyi車","神i祕SD人物", "火柴人技Dhk巧格鬥", "超音ASD速戰hk場", "小小辛打SAhkD磚塊", "火柴人技SD巧ghk格鬥", "加菲FDS貓k超人", "小小辛打SDF磚ytui塊", "卑鄙SDF的yui我2", "電流SDyuF導線", "飛天手yuiDF推車","神iy祕SD人hk物", "火柴uyi人技AS巧格hk鬥", "超音hg速戰FS場", "小小辛SDF打磚hjk塊", "火柴人SDF技hj巧格鬥", "加菲SDhk貓超人" ];

/*十萬個隨機數據*/
var arr=[],num;
for(var i = 0; i < 100000; i++){
    num=Math.floor(Math.random()*50);
    arr.push(arr0[num]);
}


var t1= new Date().getTime(); console.log(t1); //開始時間

arr.unique(); //去重

var t2 = new Date().getTime(); console.log(t2); //結束時間

console.log(t2-t1);

 

參考:http://www.ituring.com.cn/article/49791java

        http://blog.jobbole.com/33099/數組

        http://php.js.cn/blog/array-unique-in-javascript/dom

        http://www.nowamagic.net/javascript/js_RemoveRepeatElement.php性能

相關文章
相關標籤/搜索