js数组去重

引言

  • 数组去重有:双层遍历去重以及set或者map去重,除了这两种,还可以利用对象来完成数组的去重。

双层遍历

  • 数组Array的原型上有很多方法,例如forEach、indexOf、map、filter、find等等,无论使用哪两个方法进行双层遍历完成数组去重,性能远不及Set,这里就以forEach + indexOf组合举例
// 双层遍历
function forEach(arr){
    var time = Date.now()
    // 去重
    var newArr = []
    arr.forEach(item =>{
        if(newArr.indexOf(item) === -1){
            newArr.push(item)
        }
    })

    console.log('遍历', Date.now() - time)
    return newArr
}

Set集合去重

  • 利用[... new Set([1, 2, 3])] 可将一个Set实例转为数组,因为Set集合的数据不允许重复,因此达到一个去重的效果。
// set去重
function setArr(arr){
    var time = Date.now()
    // 去重
    var newArr = [...new Set(arr)]

    console.log('set', Date.now() - time)
    return newArr
}

对象

  • 使用对象去重,会进行一次遍历,利用逻辑或 ||,当对象obj不存在以当前遍历元素为键的属性,则会执行 (obj[item] = true, newArr.push(item)),以当前遍历元素为键,值为true保存在对象obj中,并且把当前遍历元素push到newArr中,否则进行下一轮遍历。
// 对象去重
function objArr(arr){

    var time = Date.now()
    // 去重
    var newArr = []
    var obj = {}
    arr.forEach(item => obj[item] || (obj[item] = true, newArr.push(item)))

    console.log('对象', Date.now() - time)
    return newArr
}

性能比较

  • 定义一个数组 arr,循环往数组存放多个数据。从运行的结果可以看出,双层遍历去重的性能是最差的。
// 创建一个数组 并使用for循环存放多个数据
var arr = [1, 2, 3, 1, 1 , 3, 2]
var arrLen = 10000
for(let i = 0; i< arrLen ; i++){
    arr.push(i)
}

// 分别调用去重函数 
forEach(arr)
setArr(arr)
objArr(arr)

Set集合 与 对象的比较

  • 从上面的运行结果看出,Set去重比对象去重的性能稍微好一点,因此让arrLen多加了两个0,看一下它们的差异。结果当数据增加之后,利用对象实现数组去重的性能是最好的,并且会随着数据的增加,性能的差距就会越大。因此当数据比较少时,使用Set集合去重,否则,利用对象完成数组的去重会更好。
// 数据 比原来多加了两个0
var arr = [1, 2, 3, 1, 1 , 3, 2]
var arrLen = 1000000
for(let i = 0; i< arrLen ; i++){
    arr.push(i)
}

// 这里考虑 Set集合 和 对象的方式去重
setArr(arr)
objArr(arr)

posted @ 2020-02-08 17:14  车神我也  阅读(240)  评论(0编辑  收藏  举报

目录列表

顶部