我有一个简单的 JavaScript Array 对象,其中包含一些数字。
[267, 306, 108]
有没有一个函数可以找到这个数组中的最大数?
我有一个简单的 JavaScript Array 对象,其中包含一些数字。
[267, 306, 108]
有没有一个函数可以找到这个数组中的最大数?
Array.max = function( array ){
return Math.max.apply( Math, array );
};
警告:由于某些 VM 上的最大参数数低至 65535,如果您不确定数组是否那么小,请使用 for 循环。
您可以使用 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);
请注意,第一个参数上下文对这些函数并不重要,因为它们是静态的。无论传递的上下文是什么,它们都将起作用。
我不是 JavaScript 专家,但我想看看这些方法是如何叠加的,所以这对我来说是一个很好的实践。我不知道这在技术上是否是对这些进行性能测试的正确方法,但我只是一个接一个地运行它们,正如您在我的代码中看到的那样。
排序并获取第 0 个值是迄今为止最糟糕的方法(它会修改数组的顺序,这可能是不可取的)。对于其他人,除非您谈论的是数百万个索引,否则差异可以忽略不计。
使用 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)
我发现对于更大的数组(~100k 个元素),用一个简单的循环简单地迭代数组实际上是值得的for
,比执行 ~30% Math.max.apply()
:
function mymax(a)
{
var m = -Infinity, i = 0, n = a.length;
for (; i != n; ++i) {
if (a[i] > m) {
m = a[i];
}
}
return m;
}