js数组去重6法解析

 

1,建个新数组,遍历老数组,若在新数组里没找到,则将这个元素放到新数组,然后返回

Array.prototype.unique1 = function()

{

var n = [];

for(var i = 0; i < this.length; i++)

{

if (n.indexOf(this[i]) == -1) n.push(this[i]);

}

return n;

}

 

2,利用hash表,将放到新数组的元素在hash表中存true值,下次遍历数组时检查元素在hash表中的值

Array.prototype.unique2 = function()

{

var n = {},r=[];

for(var i = 0; i < this.length; i++)

{

if (!n[this[i]])

{

n[this[i]] = true;

r.push(this[i]);

}

}

return r;

}

 

3,遍历老数组,若是这个第i项的元素的位置不是第i项,则是重复的,忽略掉

Array.prototype.unique3 = function()

{

var n = [this[0]];

for(var i = 1; i < this.length; i++)

{

if (this.indexOf(this[i]) == i) n.push(this[i]);

}

return n;

}

 

4,先将老数组排序,将老数组第一个放进新数组,老数组第二个与新数组第一个比较,若不一样则放进新数组中,若一样则是重复的,这种打乱原来的顺序了

Array.prototype.unique4 = function()

{

this.sort();

var re=[this[0]];

for(var i = 1; i < this.length; i++)

{

if( this[i] !== re[re.length-1])

{

re.push(this[i]);

}

}

return re;

}

 

5,新建一个将原数组排过序的新数组,对新数组进行排序,对应找到重复的元素位置,在原数组里删掉它

Array.prototype.unique5 = function(){

    var self = this;

    var _a = this.concat().sort();

    _a.sort(function(a,b){

        if(a == b){

            var n = self.indexOf(a);

            self.splice(n,1);

        }

    });

    return self;

};

 

6,先把reduce方法分析下,arr.reduce(callback,[initialValue]) callback函数有4个参数,第一个参数previousValue,若是有初始值initialValue,则是初始值,若没有,则是数组中的第一个值,第二个currentValue是数组中当前被处理的元素,在新建数组中遍历老数组中的每个元素,若是没有,在新数组中加上

Array.prototype.unique6 = function()

{

return this.reduce(function(p, c)

{

if (p.indexOf(c) < 0) p.push(c);

return p;

}, []);

};

 

一个10000个随机数的数组的六种测试用时:

method 1 used 349ms

method 2 used 5ms

method 3 used 442ms

method 4 used 15ms

method 5 used 13ms

method 6 used 424ms

参考

6 ways to get unique values of an Array in Javascript

Array.prototype.reduce()

posted @ 2015-06-07 21:28  Jesse-band  阅读(310)  评论(0编辑  收藏  举报