前端面试题汇总(数组系列一)

175 阅读2分钟

获取数组的最大值、最小值

考点: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])
通过...将参数转为参数形式,可以使max等方法被正常的调用


如何快速让一个数组乱序?

考点:

随机机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);


求众数,也就是数组中出现次数最多的数