我如何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);