数组去重性能

作者: 土豪码农 | 来源:发表于2019-02-14 22:29 被阅读0次

    今天看到一篇文章,哇,超赞的,测试一下数组去重的性能.

    测试模板

    // distinct.js
    
        let arr1 = Array.from(new Array(100000), (x, index)=>{
            return index
        });
    
        let arr2 = Array.from(new Array(50000), (x, index)=>{
            return index+index
        });
    
        let arr3 = arr1.concat(arr2);
    
        let start = new Date().getTime();
        console.log('开始数组去重');
    
        function distinct(array) {
            // 数组去重
            var newArr = []; //一个新的临时数组
            for(var i = 0; i < array.length; i++){
                if(newArr.indexOf(array[i]) === -1){
                    newArr.push(array[i]);
                }
            }
            return newArr;
        }
    
        console.log('去重后的长度', distinct(arr3).length);
    
        let end = new Date().getTime();
        console.log('耗时', end - start)
    

    然后就把自己知道的一些去重方法丢进去,就知道自己平时使用的数组去重的方法性能到底如何了.

    先试试最常见的利用一层for循环遍历加indexOf

    // 数组去重
            var newArr = []; //一个新的临时数组
            for(var i = 0; i < array.length; i++){
                if(newArr.indexOf(array[i]) === -1){
                    newArr.push(array[i]);
                }
            }
            return newArr;
    
    image.png

    明显卡成狗了,一共才150000个数据

    再来试试es6最简便的方法

    Array.from(new Set(array))
    
    image.png

    这快的有点夸张了

    解构赋值结合再试试

    [...new Set(array)]
    
    image.png

    又快了一点。

    试一下先排序再去重

        array.sort();
            const newArr = [array[0]];
            for (let i = 1; i < array.length; i++) {
                if (array[i] !== newArr[newArr.length - 1]) {
                    newArr.push(array[i]);
                }
            }
            return newArr;
    
    image.png

    也还可以

    利用对象属性唯一实现数组去重,这个是我之前想到的一个方法

    const obj = {}, newArr = [];
            for (let i = 0; i < array.length; i++) {
                if(!obj[array[i]]){
                    obj[array[i]] = 1;
                    newArr.push(array[i]);
                }
            }
            return newArr
    
    image.png

    结果让我非常惊讶,速度飞快,但是比较有局限性,之前想到这个办法就是觉得利用对象的键值对去代替indexOf或者循环会更加快,今天试了下,果然如此.但是后来发现这个方法有一定的局限性,因为object的属性会把所有类型的变量都转化为string类型的,也就是1和'1'是会被替换掉的,类似这些都会出现问题.

    文章参考自 # JavaScript 高性能数组去重

    相关文章

      网友评论

        本文标题:数组去重性能

        本文链接:https://www.haomeiwen.com/subject/jkujeqtx.html