菜单

JavaScript数组去掉重复

2010年11月14日 - javascript

引用Ext中实现方法:

Java代码
  1. unique: function( array ) {
  2. var ret = [], done = {};
  3. try {
  4. for ( var i = 0, length = array.length; i < length; i++ ) {
  5. var id = jQuery.data( array[ i ] );
  6. if ( !done[ id ] ) {
  7. done[ id ] = true;
  8. ret.push( array[ i ] );
  9. }
  10. }
  11. } catch( e ) {
  12. ret = array;
  13. }
  14. return ret;
  15. }
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循环,但是存在效率问题。

Java代码
  1. Array.prototype.unquie=function(){
  2. var newArray=new Array();
  3. var len=this.length;
  4. for (var i=0;i<len ;i++){
  5. for(var j=i+1;j<len;j++){
  6. if(this[i]===this[j]){
  7. j=++i;
  8. }
  9. }
  10. newArray.push(this[i]);
  11. }
  12. return newArray;
  13. }
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;
}

另外一种比较优化方法:

Java代码
  1. Array.prototype.unquie=function(){
  2. //需要考虑数组内容中包含boolean,string类型数据。
  3. var newArray=[] , provisionalTable = {};
  4. for (var i = 0, item; (item= this[i]) != null; i++) {
  5. if (!provisionalTable[item]) {
  6. newArray.push(item);
  7. provisionalTable[item] = true;
  8. }
  9. }
  10. return newArray;
  11. }
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;
}

运行测试时间:

Java代码
  1. console.time(‘t’);
  2. 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];
  3. console.info(array.unique())
  4. console.timeEnd(‘t’)

发表评论

电子邮件地址不会被公开。 必填项已用*标注