引用Ext中实现方法:
Java代码
- 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;
- }
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代码
- 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(){
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代码
- 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;
- }
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代码
- 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’)