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エンジンのパラメーター長の上限を超えるリスクがあります。メソッドに渡すパラメーターが多すぎる(10,000など)場合の結果は、JavaScript
エンジンによって異なります(JavaScriptCoreエンジン
ハードコードされたパラメーターの数には上限があります:65536)。これは、この制限(実際には、大きなスタックスペースを使用する動作の自然な兆候)があいまいであるためです。一部のエンジンは例外をスローし、さらに悪いことに、他のエンジンはメソッドに渡されるパラメーターの数を直接制限し、パラメーターが失われる原因になります。たとえば、あるエンジンのメソッドパラメータの上限が4であると仮定します(実際には、上限ははるかに高くなります)。
この場合、上記のコードが実行された後、適用するために実際に渡されるパラメータは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

参照:適用および組み込み関数を使用する

おすすめ

転載: blog.csdn.net/weixin_42549581/article/details/114014487