以下几种暂时没时间测试,也没时间自己去实现,先记录下来
//首先给Array对象原型上添加indexOf和lastIndexOf方法.(如果没有的话) if(!Array.prototype.indexOf){ Array.prototype.indexOf = function(element, index){ var length = this.length; if(index == null){ index = 0; }else{ index = +index || 0; if(index < 0) index+= length; if(index < 0) index = 0; } for(var current;index<length;index++){ current = this[index]; if(current === element) return index; } return -1; } } if(!Array.prototype.lastIndexOf){ Array.prototype.lastIndexOf = function(element, index){ var length = this.length; if(index == null){ index = length - 1; }else{ index = +index || 0; if(index < 0) index+= length; if(index < 0) index = -1; else if(index >= length) index = length - 1; } for(var current;index>=0;index--){ current = this[index]; if(current === element) return index; } return -1; } } //很常见的实现方式 var arrayUnique1 = function(arr){ for(var i=0,len=arr.length,result=[],item;i<len;i++){ item = arr[i]; if(result.indexOf(item) < 0) { result[result.length] = item; } } return result; } //通过lastIndexOf和splice方法实现方式 var arrayUnique2 = function(arr){ var length = arr.length; while(--length){ //如果在前面已经出现,则将该位置的元素删除 if(arr.lastIndexOf(arr[length],length-1) > -1) { arr.splice(length,1); } } return arr; }
测试结果
测试数据:var arr = [1,2,3,1,2,3,2,1,3,4,2,232];
IE7循环10,000次:
arrayUnique1为460ms,arrayUnique2为190ms。
FF3.5循环100,000次:
arrayUnique1为170ms,arrayUnique2为63ms。
其他实现方式
除了上面描述的2中实现方式外,其实还是有其他实现方式的。jQuery中就一种实现方式。我们可以看下具体的代码:
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; }
以上来自:http://www.welefen.com/javascript-array-unique.html
Array.prototype.delRepeat=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; } //但是很明显这里有for循环内嵌了另一个for循环,在大数据量下肯定非常耗时!效率低下!经过查找和高人指点优化了一个新方法: Array.prototype.delRepeat=function(){ var newArray=[]; var provisionalTable = {}; for (var i = 0, item; (item= this[i]) != null; i++) { if (!provisionalTable[item]) { newArray.push(item); provisionalTable[item] = true; } } return newArray; }