zoukankan      html  css  js  c++  java
  • 数组乱序,去重,展平

    乱序

    方法一:用sort生成随机序列

    function mixArr(arr){
        return arr.sort(() => {
            return Math.random() - 0.5;
        })
    }

    关于sort方法的参数请参考:https://www.xp.cn/b.php/95773.html

    但这种方法有一定的缺陷,运行次数多了我们就会发现,末尾的数字为大数的概率较大,开始的数字为小数的概率较大。

    原来,在Chrome v8引擎源码中,处理sort方法时,使用了插入排序和快速排序两种方案。当目标数组长度小于10时,使用插入排序;反之,使用快速排序和插入排序的混合排序。

    所以用 sort 方法乱序不准确的原因就在于:理想的方案是数组中每两个元素都要进行比较,这个比较有50%的交换位置概率。而在插入排序的算法中,当待排序元素跟有序元素进行比较时,一旦确定了位置,就不会再跟位置前面的有序元素进行比较,所以就乱序的不彻底。

    所以长度小于10不建议使用sort。
     

    方法2:洗牌算法

    function shuffle(arr){
        let m = arr.length;
        while(m > 1){
            let index = parseInt(Math.random() * m--);
            [arr[index],arr[m]] = [arr[m],arr[index]];
        }
        return arr;
    }

    去重

    方法一:逐个遍历

    function removeDup(arr){
        var result = [];
        var hashMap = {};
        for(var i = 0; i < arr.length; i++){
            var temp = arr[i]
            if(!hashMap[temp]){
                hashMap[temp] = true
                result.push(temp)
            }
        }
        return result;
    }

    方法二:ES6的set方法

    Array.from(new Set(arr))
    //或者
    [...new Set(arr)] //性能最好

    展平

    // 展平一级
    function flat(arr){
        var result = [];
        for(var i = 0; i < arr.length; i++){
            if(Array.isArray(arr[i])){
                result = result.concat(flat(arr[i]))
            }else{
                result.push(arr[i]);
            }
        }
        return result;
    }
    
    
    //展平多层
     function flattenByDeep(array,deep){
          var result = [];
          for(var i = 0 ; i < array.length; i++){
              if(Array.isArray(array[i]) && deep >= 1){
                    result = result.concat(flattenByDeep(array[i],deep -1))
              }else{
                    result.push(array[i])
              }
          }
          return result;
      }
  • 相关阅读:
    forceStopPackage与killBackgroundProcesses方法
    github上十二款最著名的Android播放器开源项目
    AndroidStudio编译错误:Error: null value in entry: blameLogFolder=null
    Vue相关开源项目库汇总 http://www.opendigg.com/tags/front-vue
    Android Drawable 那些不为人知的高效用法
    Android数据存储
    touch事件的分发机制
    Hybrid 开发
    关于Http协议
    设计原理+设计模式
  • 原文地址:https://www.cnblogs.com/AwenJS/p/12694747.html
Copyright © 2011-2022 走看看