javascript代码实例教程-js去除数组重复项

发布时间:2019-01-20 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了javascript代码实例教程-js去除数组重复项脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
小宝典致力于为广大程序猿(媛)提供高品质的代码服务,请大家多多光顾小站,小宝典在此谢过。 第一次写,感觉不知道写啥,想了天决定还是用以前用过的一些东西,看了看就写数组去除重复项算了^_^。

 

去除数组重复项有很多方法,之前因为用到,看了一下以前搜集的一些代码,进行比较,在这里总结一下,希望能给各位有所帮助,有什么问题,请各位大神不吝指导。

 

      方法一:

 

 

//两个for循环

    Array.PRototyPE.delRepeat1 = function () {

        VAR r = new Array();

        label: for (var i = 0, n = this.length; i < n; i++) {

            for (var x = 0, y = r.length; x < y; x++) {

                if (r[x] == this[i]) {

                    continue label;

                }

            }

            r[r.length] = this[i];

        }

        return r;

    }

 

这是我最先接触到的去重,相信很多人也是最先接触这个方法,这种方法运行时用到的循环太多了,效率太低,如果数据量少还行,如果是大量数据的话,那就只能说呵呵了。

 

方法二:

 

 

Array.prototype.delRepeat2 = function () {

        this.sort();//排序

        var n = [this[0]];

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

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

                n.push(this[i]);

            }

        }

        return n;

    }

 

 

 

这种是我比较喜欢用的,效率也不错,先用sort排序,加一个临时数组,然后循环遍历,将去重的数组和临时数组末进行比较,不同就加入临时数组。

 

方法三:

 

 

 Array.prototype.delRepeat3 = function () {

        var n = []; //一个新的临时数组

        for (var i = 0; i < this.length; i++) //遍历当前数组

        {

            //如果当前数组的第i在临时数组已有,跳过,否则把当前项push到临时数组里

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

        }

        return n;

    }

 

方法三虽然只有一个for循环,但indexof函数会从头检索n数组,同样效率不行。

 

方法四:

 

Array.prototype.delRepeat4 = function () {

        var n = {}, r = []; //n为hash表,r为临时数组

        for (var i = 0; i < this.length; i++) //遍历当前数组

        {

            if (!n[this[i]]) //如果hash表中没有当前项

            {

                n[this[i]] = true; //存入hash表

                r.push(this[i]); //把当前数组的当前项push到临时数组里面

            }

        }

        return r;

    }

 

这种方法去重效率很快,但是有个很大的缺点,就是内存占用多。不推荐使用。

 

方法五:

 

 

Array.prototype.delRepeat5 = function () {

        var n = [this[0]]; //结果数组

        for (var i = 1; i < this.length; i++) //从第二项开始遍历

        {

            //如果当前数组的第i项在当前数组中第一次出现的位置不是i,

            //那么表示第i项是重复的,忽略掉。否则存入结果数组

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

        }

        return n;

    }

 

这种方法和方法三一样用到了indexof。

 

方法六:

 

Array.prototype.delRepeat6 = function () {

        return this.sort().join(",,").replace(/(,|^)([^,]+)(,,/2)+(,|$)/g, "$1$2$4").replace(/,,+/g, ",").replace(/,$/, "").splIT(",");

    }

这个不用说,用了正则,o(s□t)o,感觉好复杂,我也没懂Σ( &deg; △ °|||)。

 

方法七:

 

 

 Array.prototype.delRepeat7 = function () {

        var temp = {}, len = this.length;

        for (var i = 0; i < len; i++) {

            var tmp = this[i];

            if (!temp.hasOwnProperty(tmp)) {//hasOwnProperty用来判断一个对象是否有你给出名称的属性或对象

                temp[this[i]] = "yes";

            }

        }

 

        len = 0;

        var tempArr = [];

        for (var i in temp) {

            tempArr[len++] = i;

        }

        return tempArr;

    }

 

这你是用到了hasOwnProperty,这种效率也不错.

 

 

 

下面是我的测试代码:

 

 

function delRepeatExample () {

        var arr = [];//测试的数组

        for (var i = 0; i < 10000; i++) {

            var t = parseint(Math.random() * 1000);

            arr[i] = (t.toString());

        }

        var s = new Date();//定义开始的时间!

       var a=arr.delRepeat();

 

        var dd = new Date() - s;//执行时间=当前时间-开始的时间

    }

 

分别测试了10000和100000长的数组,测试结果如下:

 

方法一:  242ms(10000长度的)     2240ms(100000长度的)

 

方法二:  6ms                               39ms

 

方法三:  255ms                            2138ms

 

方法四:  4ms                                19ms

 

方法五:  416ms                             4492ms

 

方法六:  9ms                                 50ms

 

方法七:  2ms                                 8ms

 

我个人比较倾向于方法二、方法七。

 

不多说了,就这样吧....

觉得可用,就经常来吧! 脚本宝典 欢迎评论哦! js脚本,巧夺天工,精雕玉琢。小宝典献丑了!

脚本宝典总结

以上是脚本宝典为你收集整理的javascript代码实例教程-js去除数组重复项全部内容,希望文章能够帮你解决javascript代码实例教程-js去除数组重复项所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。