乐趣区

JS实现数组去重重复的元素只保留一个

JavaScript 实现去除数组中重复的元素

看了网上很多大神的写法,蠢蠢欲动,于是自己照着也写了几个,选出来最优的一个拿出来与大家分享一下。

准备数据

分别创建了两个长度为 10W 和 5W 的数组
然后通过 unique() 方法合并两个数组,并去掉其中的重复项

let arr1 = Array.from(new Array(100000), (x, index)=>{return index})
 
let arr2 = Array.from(new Array(50000), (x, index)=>{return index+index})
 
let start = new Date().getTime()
console.log('开始数组去重')
 
function unique(a, b) {// 数组去重}
 
console.log('去重后的长度', unique(arr1,arr2).length);
let end = new Date().getTime()
console.log('耗时', end - start);

放入去重函数并运行

首先用的是刘春龙大佬写的

arr3 = arr1.concat(arr2);

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;
}

// 运行
console.log('去重后的长度', arr3.unique4().length);
let end = new Date().getTime()
console.log('耗时', end - start);

输出结果

开始数组去重
去重后的长度 100000
耗时 169

然后是 Wise.Wrong 大佬的 for…of + Object

function distinct(a, b) {let arr = a.concat(b)
    let result = []
    let obj = {}
 
    for (let i of arr) {if (!obj[i]) {result.push(i)
            obj[i] = 1
        }
    }
 
    return result
}

输出结果

开始数组去重
去重后的长度 100000
耗时 22

最后,参照着 Wise.Wrong 大佬贴出来的写法 写了一个:

开始数组去重
去重后的长度 100000
耗时 19

这里已经将 Array.prototype.unique 汇集到了 JavaScript 常用函数库 – jutils 中去了

jutils.arrayUniq();

放入带有重复数据的数组就可以直接使用了。

参考文章

  • JavaScript 高性能数组去重 – Wise.Wrong
  • JS 中数组去重问题 – 刘春龙的博客
退出移动版