数组乱序,去重,展平

乱序

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

 

posted @ 2020-04-13 22:57  想学JS的前端  阅读(220)  评论(0编辑  收藏  举报