Math.max.apply/Math.min.apply获取数组最大最小值

用Math.max/Math.min求得数组中的最大/小值

/* 找出数组中最大/小的数字 */
var numbers = [5, 6, 2, 3, 7];

/* 使用Math.min/Math.max以及apply 函数时的代码 */
var max = Math.max.apply(null, numbers); /* 基本等同于 Math.max(numbers[0], ...) 或 Math.max(5, 6, ..) */
var min = Math.min.apply(null, numbers);

/* 对比:简单循环算法 */
max = -Infinity, min = +Infinity;

for (var i = 0; i < numbers.length; i++) {
    
    
  if (numbers[i] > max)
    max = numbers[i];
  if (numbers[i] < min)
    min = numbers[i];
}

注意:如果按上面方式调用apply,有超出JavaScript引擎参数长度上限的风险。一个方法传入过多参数(比如一万个)时的后果在不同JavaScript
引擎中表现不同。(JavaScriptCore引擎中有被硬编码的
参数个数上限:65536)。这是因为此限制(实际上也是任何用到超大栈空间的行为的自然表现)是不明确的。一些引擎会抛出异常,更糟糕的是其他引擎会直接限制传入到方法的参数个数,导致参数丢失。比如:假设某个引擎的方法参数上限为4(实际上限当然要高得多),
这种情况下,上面的代码执行后, 真正被传递到 apply的参数为 5, 6, 2, 3 ,而不是完整的数组。

如果你的参数数组可能非常大,那么推荐使用下面这种混合策略:将数组切块后循环传入目标方法:

/** 切片循环获取数组最大最小值
* @Descripttion: 解决apply中因参数过长导致参数丢失问题
* @param {*} arr
* @param {*} type 'min' or 'max'
* @return {*}
* @Author: TinaZ
* @Date: 2021-02-24
*/
function fnGetMinOrMaxOfArray(arr,type) {
    
    
	var val = 0;
	var QUANTUM = 3; // 切片限制 默认为32768(65536/2) 3为演示使用
	
	if(type == 'min'){
    
    
	   val = Infinity;
	   for (var i = 0, len = arr.length; i < len; i += QUANTUM) {
    
    
	       var subval = Math.min.apply(null, arr.slice(i, Math.min(i + QUANTUM, len)));
	       val = Math.min(subval, val);
	   }
	}
	if(type == 'max'){
    
    
	   val = -Infinity;
	   for (var i = 0, len = arr.length; i < len; i += QUANTUM) {
    
    
	       var subval = Math.max.apply(null, arr.slice(i, Math.min(i + QUANTUM, len)));
	       val = Math.max(subval, val);
	   }
	}
	return val;
}
var min = fnGetMinOrMaxOfArray([0,1,2,3,4,5,6], 'min');
var max = fnGetMinOrMaxOfArray([0,1,2,3,9,5,6], 'max');
console.log('min',min) //0
console.log('max',max) //9

参考:使用apply和内置函数

猜你喜欢

转载自blog.csdn.net/weixin_42549581/article/details/114014487