js去除数组重复项

简介: 原文:js去除数组重复项第一次写,感觉不知道写啥,想了半天决定还是用以前用过的一些东西,看了看就写数组去除重复项算了^_^。 去除数组重复项有很多方法,之前因为用到,看了一下以前搜集的一些代码,进行比较,在这里总结一下,希望能给各位有所帮助,有什么问题,请各位大神不吝指导。
原文: 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(╯□╰)o,感觉好复杂,我也没懂Σ( ° △ °|||)︴。

方法七:

 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

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

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

目录
相关文章
|
9月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
9月前
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
自然语言处理 前端开发 JavaScript
🛠️ JavaScript数组操作指南:20个精通必备技巧🚀
本文详细介绍了 JavaScript 中的 20 个高效数组操作技巧,涵盖了从基本的添加、移除元素,到数组转换和去重等高级操作。强调了不可变性的重要性,提供了清晰的代码示例,帮助开发者编写更整洁和高效的代码。无论是新手还是经验丰富的开发者,这些技巧都将显著提升您的编码能力,使您在项目中更具竞争力。
260 2
|
JavaScript 前端开发 测试技术
JS都有哪些操作数组的方法
JS都有哪些操作数组的方法
439 3
|
缓存 JavaScript 前端开发
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
196 1
|
JavaScript 前端开发 API
JS中数组的方法flat()怎么用
JS中数组的方法flat()怎么用
221 0
|
JavaScript 前端开发 索引
JavaScript中数组、对象等循环遍历的常用方法介绍(一)
JavaScript中数组、对象等循环遍历的常用方法介绍(一)
207 0
|
JavaScript 前端开发
JS将两个数组和合并成数组包对象格式的方法
JS将两个数组和合并成数组包对象格式的方法
256 0
|
JavaScript 前端开发
js中数组对象去重的方法
js中数组对象去重的方法
156 0
|
JavaScript 前端开发 索引
JS遍历数组里数组下的对象,根据数组中对象的某些值,组合成新的数组对象
这篇文章介绍了如何在JavaScript中遍历数组里数组下的对象,并根据对象的某些属性值组合成一个新的数组对象。主要内容包括使用ES6的`for...of`循环来遍历数组对象,然后根据需要提取对象中的属性值,并将它们放入新的对象中,最终形成一个新的对象数组以供使用。