Answers:
Array.max = function( array ){
return Math.max.apply( Math, array );
};
警告:由于某些VM的最大参数个数低至65535,因此,如果不确定数组的大小,请使用for循环。
apply
通话费用可以很轻松地将其清除。
RangeError: Maximum call stack size exceeded.
您可以使用apply函数来调用Math.max:
var array = [267, 306, 108];
var largest = Math.max.apply(Math, array); // 306
这个怎么运作?
该应用功能用于调用另一个函数,与给定的上下文中和参数,作为数组提供。min和max函数可以采用任意数量的输入参数:Math.max(val1,val2,...,valN)
因此,如果我们致电:
Math.min.apply(Math, [1,2,3,4]);
apply函数将执行:
Math.min(1,2,3,4);
请注意,第一个参数(上下文)对于这些功能并不重要,因为它们是静态的,无论传递什么作为上下文,它们都将起作用。
我不是JS专家,但是我想看看这些方法是如何叠加的,所以这对我来说是个好习惯。我不知道从技术上来讲这是否是正确测试这些方法的正确方法,但是正如您在我的代码中看到的那样,我只是一个接一个地运行它们。
到目前为止,排序和获取0th值是最糟糕的方法(它会修改数组的顺序,这可能是不希望的)。对于其他情况,除非您要谈论数百万个索引,否则差异可以忽略不计。
五次运行的平均结果,其中包含100,000个索引的随机数数组:
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 b-a;})[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)
jsperf tests
了
您可以按降序对数组进行排序并获得第一项:
[267, 306, 108].sort(function(a,b){return b-a;})[0]
sort(function(a,b){return b-a;})
[...].sort().pop()
这个怎么样:
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);
});
-Infinity
。
几乎所有答案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;
}
}
它在我的计算机上的FireFox上被证明是最大的-591519。这意味着,如果数组包含超过591519个项目,Math.max.apply()
将导致RangeError。
对此问题的最佳解决方案是迭代方式(来源: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];
}
我已经在这里的博客上写了关于这个问题的文章。
https://developer.mozilla.org/zh-CN/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);
通过手动方式轻松找到最大值和最小值。这段代码比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;
}
findmax()
如果数组中只有负数,则给出错误的结果;findmin()
为空数组给出错误的结果。
要在您只需要使用的数组中找到最大的数字Math.max(...arrayName);
,它的工作方式如下:
let myArr = [1, 2, 3, 4, 5, 6];
console.log(Math.max(...myArr));
要了解更多信息Math.max
:https :
//developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/max
您也可以扩展Array
为具有此功能,并使它成为每个数组的一部分。
Array.prototype.max = function(){return Math.max.apply( Math, this )};
myArray = [1,2,3];
console.log( myArray.max() );
我刚开始使用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
仅包含负数,将有麻烦。
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;
var tmax = Math.max.apply(Math, max)
,或者更好的方法,例如在stackoverflow.com/a/54980012/7438857中使用循环功能的闭包。进行此修改后,最好回答一个单独的问题,即如何“在多维数组中找到最大的数字”,或在stackoverflow.com/questions/32616910/…上回答。在制品:jsfiddle.net/jamesray/3cLu9for/8。
使用冒泡排序查找最大值和最小值
var arr = [267, 306, 108];
for(i=0, k=0; i<arr.length; i++) {
for(j=0; j<i; j++) {
if(arr[i]>arr[j]) {
k = arr[i];
arr[i] = arr[j];
arr[j] = k;
}
}
}
console.log('largest Number: '+ arr[0]);
console.log('Smallest Number: '+ arr[arr.length-1]);
根据@Quasimondo的评论(似乎已被广泛忽略),以下内容似乎具有最佳性能,如下所示:https : //jsperf.com/finding-maximum-element-in-an-array。请注意,虽然对于问题中的阵列,性能可能不会产生重大影响,但对于大型阵列而言,性能变得更为重要,并且再次指出,Math.max()
如果阵列长度大于65535,则使用甚至都不起作用。另请参见此答案。
function largestNum(arr) {
var d = data;
var m = d[d.length - 1];
for (var i = d.length - 1; --i > -1;) {
if (d[i] > m) m = d[i];
}
return m;
}
一for/of
回路解决方案:
const numbers = [2, 4, 6, 8, 80, 56, 10];
const findMax = (...numbers) => {
let currentMax = numbers[0]; // 2
for (const number of numbers) {
if (number > currentMax) {
console.log(number, currentMax);
currentMax = number;
}
}
console.log('Largest ', currentMax);
return currentMax;
};
findMax(...numbers);
Math.max(...[267, 306, 108]);