ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数组乱序,去重,展平

2020-04-13 23:02:39  阅读:231  来源: 互联网

标签:sort arr return 展平 result 数组 var array 乱序


乱序

方法一:用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;
  }

 

标签:sort,arr,return,展平,result,数组,var,array,乱序
来源: https://www.cnblogs.com/AwenJS/p/12694747.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有