日期:2014-05-16  浏览次数:20448 次

JavaScript数组去掉重复
引用Ext中实现方法:
unique: function( array ) {  
        var ret = [], done = {};  
        try {  
            for ( var i = 0, length = array.length; i < length; i++ ) {  
                var id = jQuery.data( array[ i ] );  
  
                if ( !done[ id ] ) {  
                    done[ id ] = true;  
                    ret.push( array[ i ] );  
                }  
            }  
  
        } catch( e ) {  
            ret = array;  
        }   
        return ret;  
}

实现中需要注意的就是对于存在的如何去标示,ext采用的是jQuery.data(array[ i ])方法生成一个hash中key,循环中检测是否已经存在同样的key,如果存在那么在新数组中就不在重复。以此达到去掉重复数据。

网上常用方式是2个重复for循环,但是存在效率问题。
Array.prototype.unquie=function(){
	var newArray=new Array();
	var len=this.length;
	for (var i=0;i<len ;i++){
		for(var j=i+1;j<len;j++){
			if(this[i]===this[j]){
				j=++i;
			}
		}
		newArray.push(this[i]);
	}
	return newArray;
}

另外一种比较优化方法:
Array.prototype.unquie=function(){
        //需要考虑数组内容中包含boolean,string类型数据。
	var newArray=[] , provisionalTable = {};
	for (var i = 0, item; (item= this[i]) != null; i++) {
        if (!provisionalTable[item]) {
            newArray.push(item);
            provisionalTable[item] = true;
        }
    }
    return newArray;
}


运行测试时间:
console.time('t');
var array = [1,false,'',true,true,4,4,4,4,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4];
console.info(array.unique())
console.timeEnd('t')