引用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')