数组乱序,去重,展平
乱序
方法一:用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%的交换位置概率。而在插入排序的算法中,当待排序元素跟有序元素进行比较时,一旦确定了位置,就不会再跟位置前面的有序元素进行比较,所以就乱序的不彻底。
方法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; }