zoukankan      html  css  js  c++  java
  • 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)
    
    

  • 相关阅读:
    Xamarin.Forms之ToolbarItem
    Xamarin.Forms一些常见问题
    Xamarin.Forms之页面及导航
    Xamarin.Forms 自定义控件(呈现器和效果)
    Xamarin.Forms之主题
    Xamarin.Forms之样式
    Android开发
    eShopOnContainers项目
    使用Xamarin.Forms构建企业应用
    Xamarin.Forms之XAML
  • 原文地址:https://www.cnblogs.com/HJ412/p/12283919.html
Copyright © 2011-2022 走看看