我如何findJavaScript数组中包含的最大数字?

我有一个简单的JavaScript数组对象包含几个数字。

[267, 306, 108] 

有没有一个函数可以find这个数组中最大的数字?

Resig救援:

 Array.max = function( array ){ return Math.max.apply( Math, array ); }; 

您可以使用apply函数来调用Math.max :

 var array = [267, 306, 108]; var largest = Math.max.apply(Math, array); // 306 

怎么运行的?

apply函数用于调用具有给定上下文和参数的另一个函数,并作为数组提供。 min和max函数可以接受任意数量的input参数:Math.max(val1,val2,…,valN)

所以如果我们打电话:

 Math.min.apply(Math, [1,2,3,4]); 

apply函数将执行:

 Math.min(1,2,3,4); 

请注意,第一个参数(上下文)对于这些函数并不重要,因为它们是静态的,无论上下文是什么都传递,它们将工作。

我发现对于更大的数组(大约100k个元素),实际上只需要用一个谦虚的for循环迭代数组,就比Math.max.apply()要好30%。

 function mymax(a) { var m = -Infinity, i = 0, n = a.length; for (; i != n; ++i) { if (a[i] > m) { m = a[i]; } } return m; } 

基准testing结果

我不是JS专家,但我想看看这些方法是如何叠加起来的,所以这对我来说是很好的做法。 我不知道这在技术上是否是性能testing的正确方法,但是我只是一个接着一个地运行它们,就像我在代码中看到的一样。

sorting和获得第0个值是迄今为止最糟糕的方法(并且它修改了您的数组的顺序,这可能不是所期望的)。 对于其他人来说,除非你正在谈论数以百万计的指数,否则这个差距是微不足道的

5次运行的平均结果,包含100,000个索引的随机数组:

  • 减less运行4.0392ms
  • Math.max.apply运行3.3742ms
  • sorting和得到0值运行了67.4724ms
  • reduce()中的Math.max运行了6.5804ms
  • 自定义的findmax函数运行了1.6102ms

 var performance = window.performance function findmax(array) { var max = 0, a = array.length, counter for (counter=0;counter<a;counter++) { if (array[counter] > max) { max = array[counter] } } return max } function findBiggestNumber(num) { var counts = [] var i for (i = 0; i < num; i++) { counts.push(Math.random()) } var a, b a = performance.now() var biggest = counts.reduce(function(highest, count){ return highest > count ? highest : count }, 0) b = performance.now() console.log('reduce took ' + (b - a) + ' ms to run') a = performance.now() var biggest2 = Math.max.apply(Math, counts) b = performance.now() console.log('Math.max.apply took ' + (b - a) + ' ms to run') a = performance.now() var biggest3 = counts.sort(function(a,b){return ba;})[0] b = performance.now() console.log('sorting and getting the 0th value took ' + (b - a) + ' ms to run') a = performance.now() var biggest4 = counts.reduce(function(highest, count){ return Math.max(highest,count) }, 0) b = performance.now() console.log('Math.max within reduce() took ' + (b - a) + ' ms to run') a = performance.now() var biggest5 = findmax(counts) b = performance.now() console.log('custom findmax function took ' + (b - a) + ' ms to run') console.log(biggest + '-' + biggest2 + '-' + biggest3 + '-' + biggest4 + '-' + biggest5) } findBiggestNumber(1E5) 

最简单的语法,与新的传播运算符 :

 var arr = [1, 2, 3]; var max = Math.max(...arr); 

来源: Mozilla MDN

您可以按降序对数组进行sorting并获取第一个项目:

 [267, 306, 108].sort(function(a,b){return ba;})[0] 

这个怎么样:

 var arr = [1,2,3,4]; var largest = arr.reduce(function(x,y){ return (x > y) ? x : y; }); console.log(largest); 

如何使用Array.reduce ?

 [0,1,2,3,4].reduce(function(previousValue, currentValue){ return Math.max(previousValue,currentValue); }); 

查找最大值和最小值简单和手动的方式。 这个代码比Math.max.apply快得多,我已经尝试了数组中的1000k …

 function findmax(array) { var max = 0; var a = array.length; for (counter=0;counter<a;counter++) { if (array[counter] > max) { max = array[counter]; } } return max; 

}

  function findmin(array) { var min = array[0]; var a = array.length; for (counter=0;counter<a;counter++) { if (array[counter] < min) { min = array[counter]; } } return min; 

}

几乎所有的答案都使用Math.max.apply() ,这是很好,很花哨但有一定的局限性。

函数参数被放置在堆栈上,这有一个缺点 – 一个限制。 所以,如果你的数组大于限制,它将失败,并出现RangeError: Maximum call stack size exceeded.

要查找调用堆栈大小,我使用了下面的代码:

 var ar = []; for (var i = 1; i < 100*99999; i++) { ar.push(1); try { var max = Math.max.apply(Math, ar); } catch(e) { console.log('Limit reached: '+i+' error is: '+e); break; } } 

它被certificate是我的机器上最大的FireFox – 591519 。 这意味着如果你的数组包含超过591519项, Math.max.apply()将导致RangeError

这个问题的最佳解决scheme是迭代的方式(信用: https : //developer.mozilla.org/ ):

 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]; } 

我在这里写了关于这个问题的博客。

当然存在: Math.max.apply(null,[23,45,67,-45]) ,结果返回67 ;

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max

 const inputArray = [ 1, 3, 4, 9, 16, 2, 20, 18]; const maxNumber = Math.max(...inputArray); console.log(maxNumber); 

不要忘记,可以使用Function.prototype.bind来完成换行,给你一个“全原生”的function

 var aMax = Math.max.apply.bind(Math.max, Math); aMax([1, 2, 3, 4, 5]); // 5 

您也可以扩展Array来使其具有此function,并使其成为每个数组的一部分。

 Array.prototype.max = function(){return Math.max.apply( Math, this )}; myArray = [1,2,3]; console.log( myArray.max() ); 

findmultidimensional array中最大的数字

 var max = []; for(var i=0; arr.length>i; i++ ){ var arra = arr[i]; var largest = Math.max.apply(Math, arra); max.push(largest); } return max; 

你也可以使用forEach :

 var maximum = Number.MIN_SAFE_INTEGER; var array = [-3, -2, 217, 9, -8, 46]; array.forEach(function(value){ if(value > maximum) { maximum = value; } }); console.log(maximum); // 217 

我刚刚开始使用JS,但我认为这种方法会很好:

 var array = [34, 23, 57, 983, 198];<br> var score = 0; for(var i = 0; i = array.length; i++) { if(array[ i ] > score) { score = array[i]; } } 

使用 – Array.prototype.reduce()很酷!

[267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val)

其中acc =累加器val =当前值 ;

 var a = [267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val); console.log(a); 

运行这个:

 Array.prototype.max = function(){ return Math.max.apply( Math, this ); }; 

现在尝试[3,10,2].max()返回10

你可以试试这个,

 var arr = [267,306,108]; var largestNum = 0; for(i=0;i<arr.length;i++) { if(arr[i]>largest){ var largest = arr[i]; } } console.log(largest);