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