js数组去重复

以下几种暂时没时间测试,也没时间自己去实现,先记录下来

//首先给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;
}

以上来自:http://www.css88.com/archives/2429

原文地址:https://www.cnblogs.com/walkerwang/p/1970330.html