我有一个简单的 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;
}