获取数组的最大值、最小值
考点:apply、扩展运算符
方法一:可以利用sort将数组先进行排序然后取第一和最后一位
function getMaxAndMinNumArr(arr){
var sortArr = arr.sort((a,b)=>{return a-b});
// return [sortArr.shift(),sortArr.pop()]; // 此性能不好,原因是数组在内存中的存放是连续内存,操作第一次,涉及所有元素的位移
return [sortArr[0],sortArr[arr.length-1]]
}
getMaxAndMinNumArr([100,20,3,4,5])
// [3, 100]
方法二:可以利用for循环依次比较取最大和最小值,时间复杂度也不高,O(n)
方法三:利用Math的方法和apply结合,简单方便
Math.max.apply(null,[1,2,3,4,5]);
Math.min.apply(null,[1,2,3,4,5]);
Math.max.apply({},[1,10,2,3,4,5])
Math.max.apply(undefined,[1,10,2,3,4,5])
Math.max.apply({a:1},[1,10,2,3,4,5])这上面的代码,有改变this指向的,这道题目,跟this指向无关,主要是调用Math.max的时候,接收的参数是参数形式的入参,而不能接收数组。通过apply来让max在调用的时候,可以接收数组形式的参数。
方法四:使用es6的扩展符
Math.max(...[1,2,3,4,5])
Math.min(...[1,2,3,4,5])如何快速让一个数组乱序?
考点:
随机机Math.random、parseInt(Math.floor)向下取整、通过随机索引来获取数组中的某一个随机数,再通过交互随机数和当前索引数的位置,来实现洗牌
function shuffle(arr){
if(Object.prototype.toString.call(arr)!="[object Array]"){return arr}
var arrLength = arr.length,
randomIndex,//存储随机索引
tempItem; // 存储随机索引的数据
for(var i=0;i<arr.length;i++){
randomIndex = parseInt(Math.random()*(i+1));
tempItem = arr[randomIndex];
arr[randomIndex]=arr[i];
arr[i] = tempItem;
}
return arr
}
shuffle([1,100,2,3,4,5,6])创建数组并填充数组为不同数据,不用ramdajs时,用fill并map通过索引来填充数组
var arr1 = new Array(10).fill(0).map((item, index) => index + 1);
console.log(arr1);// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]通过sort 返回 -1 或者1 进行排序
直接利用sort进行排序,有漏洞,大部分元素位置没有移动
var arr = [1,2,3,4,5,6]
arr.sort((a, b) => (Math.random() > 0.5 ? -1 : 1));
console.log(arr);