数组去重

数组去重

由于js本身并没有提供数组去重的方法,现自己总结以下几种去重方法

1:indexof()

缺点:不能去掉值相同,类型不同的数据

[1,2,3,4,"1",1] -> [1,2,3,4,"1"]

[1,2,3,4,1] -> [1,2,3,4]

var arr = [1,2,3,1,4];

Array.prototype.unique = function(){
    var _arr = [];
    for(var i= 0,l=this.length;i<l;i++){
        if(_arr.indexOf(this[i]) == -1){
            _arr.push(this[i])
        }
    }
    return _arr
};

console.log(arr);//[ 1, 2, 3, 1, 4 ]
console.log(arr.unique());//[ 1, 2, 3, 4 ]

2:indexof()

寻找存入参数在数组中第一次出现的位置

缺点:不能去掉值相同,类型不同的数据

[1,2,3,4,"1",1] -> [1,2,3,4,"1"]

[1,2,3,4,1] -> [1,2,3,4]

var arr = [1,2,3,1,4];

Array.prototype.unique = function(){
    var _arr = [];
    for(var i= 0,l=this.length;i<l;i++){
        if(this.indexOf(this[i]) == i){
            _arr.push(this[i])
        }
    }
    return _arr
};

console.log(arr);//[ 1, 2, 3, 1, 4 ]
console.log(arr.unique());//[ 1, 2, 3, 4 ]

3:采用hash

寻找存入参数在数组中第一次出现的位置

缺点:增加了内存,以空间换时间

[1,2,3,4,"1",1] -> [1,2,3,4]
var arr = [1,2,3,1,4,"1"];

Array.prototype.unique = function(){
    var _arr = [],obj={};
    for(var i= 0,l=this.length;i<l;i++){
        if(!obj[this[i]]){
            obj[this[i]] = true;
            _arr.push(this[i])
        }
    }
    return _arr
};

console.log(arr);//[ 1, 2, 3, 1, 4, '1' ]
console.log(arr.unique());//[ 1, 2, 3, 4 ]

4:sort()

寻找存入参数在数组中第一次出现的位置

缺点:不能去掉值相同,类型不同的数据

[1,2,3,4,"1",1] -> [1,2,3,4,"1"]

[1,2,3,4,1] -> [1,2,3,4]

var arr = [1,2,3,1,4,"1"];

Array.prototype.unique = function(){
    this.sort();
    var _arr = [this[0]];
    for(var i= 0,l=this.length;i<l;i++){
        if(_arr[_arr.length-1] !== this[i]){
            _arr.push(this[i])
        }
    }
    return _arr
};

console.log(arr);//[1,2,3,1,4,"1"]
console.log(arr.unique());//[1,2,3,4,"1"]

5:sort()

缺点:不能去掉值相同,类型不同的数据

var arr = [1,2,3,1,4,"1"];

Array.prototype.unique = function(){
    var self = this;
    var _arr = this.concat().sort();
    _arr.sort(function(a,b){
        if(a == b){
            self.splice(self.indexOf(a),1)
        }
    });
    return self
};

console.log(arr);//[ 1, 2, 3, 1, 4, '1' ]
console.log(arr.unique());//[ 2, 3, 4, '1' ]

6:reduce()

能去掉值相同,类型不同的数据

[ 1, 2, 3, 1, 4, '1' ] -> [ 1, 2, 3, 4, '1' ]

var arr = [1,2,3,1,4,"1"];

Array.prototype.unique = function(){
    return this.reduce(function(a,b){
        if(a.indexOf(b) == -1 ){
            a.push(b);
        }
        return a;
    },[]);
};

console.log(arr);//[ 1, 2, 3, 1, 4, '1' ]
console.log(arr.unique());//[ 1, 2, 3, 4, '1' ]

7:把A数组循环赋值到B数组

var arr = [1,2,3,1,4,"1"];

Array.prototype.unique = function(){
    var result = [];
    var isRepeat ;
    for(var i=0;i<this.length;i++){
        isRepeat = false;
        for(var j=0;j<result.length;j++){
            if(this[i] == result[j]){
                isRepeat = true;
                break;
            }
        }
        if(!isRepeat){
            result.push(this[i])
        }
    }
    return result;
};

console.log(arr);//[ 1, 2, 3, 1, 4, '1' ]
console.log(arr.unique());//[ 1, 2, 3, 4 ]

以下是一个测试上述7中方法的效率

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>数组去重判断</title>
</head>

<body >

<div id="out"></div>

<script>

    document.write = function(s){
        document.getElementById("out").innerHTML += s
    };

    Array.prototype.unique1 = function(){
        var _arr = [];
        for(var i= 0,l=this.length;i<l;i++){
            if(_arr.indexOf(this[i]) == -1){
                _arr.push(this[i])
            }
        }
        return _arr;
    };

    Array.prototype.unique2 = function(){
        var _arr = [];
        for(var i= 0,l=this.length;i<l;i++){
            if(this.indexOf(this[i]) == i){
                _arr.push(this[i])
            }
        }
        return _arr;
    };

    Array.prototype.unique3 = function(){
        var _arr = [],obj={};
        for(var i= 0,l=this.length;i<l;i++){
            if(!obj[this[i]]){
                obj[this[i]] = true;
                _arr.push(this[i])
            }
        }
        return _arr
    };
    Array.prototype.unique4 = function(){
        this.sort();
        var _arr = [this[0]];
        for(var i= 0,l=this.length;i<l;i++){
            if(_arr[_arr.length-1] !== this[i]){
                _arr.push(this[i])
            }
        }
        return _arr
    };

    Array.prototype.unique5 = function(){
        var self = this;
        var _arr = this.concat().sort();
        _arr.sort(function(a,b){
            if(a == b){
                self.splice(self.indexOf(a),1)
            }
        });
        return self
    };

    Array.prototype.unique6 = function(){
        return this.reduce(function(a,b){
            if(a.indexOf(b) == -1 ){
                a.push(b);
            }
            return a;
        },[]);
    };

    Array.prototype.unique7 = function(){
        var result = [];
        var isRepeat ;
        for(var i=0;i<this.length;i++){
            isRepeat = false;
            for(var j=0;j<result.length;j++){
                if(this[i] == result[j]){
                    isRepeat = true;
                    break;
                }
            }
            if(!isRepeat){
                result.push(this[i])
            }
        }
        return result;
    };

    function test(){
        var testArr  = [];
        for(var i=0;i<10000;i++){
            testArr.push("a"+Math.round(Math.random(i)*10000))
        }
        var test1 = doTest(testArr,1);
        var test2 = doTest(testArr,2);
        var test3 = doTest(testArr,3);
        var test4 = doTest(testArr,4);
        var test5 = doTest(testArr,5);
        var test6 = doTest(testArr,6);
        var test7 = doTest(testArr,7);

        document.write(testArr.length+'<br>');
        document.write(test1.length+'<br>');
        document.write(test2.length+'<br>');
        document.write(test3.length+'<br>');
        document.write(test4.length+'<br>');
        document.write(test5.length+'<br>');
        document.write(test6.length+'<br>');
        document.write(test7.length+'<br>');

    }
    function doTest(arr,n){
        var startTime = (new Date()).getTime();
        var re = [];
        switch (n){
            case 1:
                re = arr.unique1();
                break;
            case 2:
                re = arr.unique2();
                break;
            case 3:
                re = arr.unique3();
                break;
            case 4:
                re = arr.unique4();
                break;
            case 5:
                re = arr.unique5();
                break;
            case 6:
                re = arr.unique6();
                break;
            case 7:
                re = arr.unique7();
                break;

        }
        var endTime = (new Date()).getTime();
        document.write("method"+n+"使用时间"+(endTime-startTime)+"ms<br/>");
        return re;
    }
    test();

</script>


</body>
</html>

结果输出:

method1使用时间565ms
method2使用时间741ms
method3使用时间25ms
method4使用时间57ms
method5使用时间28ms
method6使用时间526ms
method7使用时间434ms
10000
6331
6331
6331
6331
10000
6331
6331
posted on 2016-05-31 20:24  借个火点烟  阅读(191)  评论(0编辑  收藏  举报