• 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

  • 相关阅读:
    数据库三,exec内置函数
    HDU 1003:Max Sum(DP,连续子段和)
    HDU 1024:Max Sum Plus Plus(DP,最大m子段和)
    Codeforces 698A:Vacations(DP)
    牛客多校第五场 J:Plan
    51Nod 1091:线段的重叠(贪心)
    ZZNU 2125:A + B 普拉斯(傻逼题+大数加法)
    HDU 1010:Tempter of the Bone(DFS+奇偶剪枝+回溯)
    HDU 1176:免费馅饼(DP,自认为很详细的解释)
    POJ 2312:Battle City(BFS)
  • 原文地址:https://www.cnblogs.com/walkerwang/p/1970330.html
Copyright © 2020-2023  润新知