ES6+ | 数组去重

文章目录

  • 场景
  • 实现
  • 效率对比
  • 说明

场景

数组去重是一个极为常见的小需求场景。数组去重的方法有很多,但是最为简单也是性能最好的是使用ES6引入的SET数据结构与扩展运算符,但当所处需求场景不支持使用set时,可以使用对象属性名唯一的性质进行去重,这是时间复杂度第二低的方法。

实现

使用set实现,极为简单明了。使用对象属性名唯一,也并不复杂,参考代码如下:

// set
function deDuplicate(arr){
    return [...new Set(arr)]
}

// 对象唯一
function deDuplicateByObj(arr) {
    let result = []
    let obj = {}
    for (let i of arr) {
        if (!obj[i]) {
            result.push(i)
            obj[i] = 1
        }
    }
    return result
}

效率对比

我们用上述两种方法对一个容量为一千万的数组进行去重,比较两者的耗时可见,使用set的耗时是使用对象属性名唯一的一半,所以推荐,在能使用set的场景下,就使用set。少数至于那些使用双重循环,复杂度在O(n²)的方法因为效率极低,此处就不加以说明和对比了。

let arr = []
for (let i = 0; i < 10000000; i++) {
    for (let j = 0; j < 3; j++) {
        arr.push(j)
    }
}

let begin = new Date().getTime()
let res = deDuplicate(arr)
console.log(res)
let end = new Date().getTime()
console.log(end - begin + 'ms');

begin = new Date().getTime()

deDuplicateByObj(arr)
console.log(res)
end = new Date().getTime()
console.log(end - begin + 'ms');

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190728223243758.pngES6+ | 数组去重_第1张图片

说明

set这么好用,那么哪些场景下会出现不支持的情况呢? 因为set是ES6新增的全局对象,使用babel仅能将es6语法糖进行转义,而不能对这些新的数据集合类型加以转化,所以会出现不兼容的情况。如果可以使用babel-pollyfill则可以解决问题,但如果babel-polyfill的引入导致了新的问题,那么还是建议使用对象属性名唯一的方法进行数组去重。

你可能感兴趣的:(ES6+)