我怎样才能找到JavaScript数组中包含的最大数字?

dot*_*tty 201 javascript arrays algorithm max

我有一个包含几个数字的简单JavaScript Array对象.

[267, 306, 108]
Run Code Online (Sandbox Code Playgroud)

是否有一个函数可以找到这个数组中最大的数字?

Cre*_*esh 308

救援人员:

Array.max = function( array ){
    return Math.max.apply( Math, array );
};
Run Code Online (Sandbox Code Playgroud)

  • 啊,但是现在它以一种略微弯曲的方式贴上了**质量贴纸**! (15认同)
  • 此外,这种方法并不健全.如果您的数组大于最大堆栈大小,则会失败,从而导致"RangeError:超出最大调用堆栈大小" (9认同)
  • @CrescentFresh根据此规则:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply将其硬编码为65535。根据此规则:https://code.google .com / p / v8 / issues / detail?id = 172并且通过知道将参数压入堆栈,我们知道它不是无限的 (3认同)
  • FWIW,如果性能是您解决方案的一个因素,我会测试**与您自己的易编码功能相比,以确保它表现良好.我们倾向于假设本机实现会更快; 实际上,"apply"调用的成本可以很容易地解决这个问题. (2认同)
  • 如果我的数组长度大于参数计数限制怎么办? (2认同)
  • 不幸的是,尽管该解决方案很优雅,但与进行比较的简单循环相比,性能要差得多。这是一个比较各种选择的测试:http://jsperf.com/finding-maximum-element-in-an-array (2认同)

CMS*_*CMS 194

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

var array = [267, 306, 108];
var largest = Math.max.apply(Math, array); // 306
Run Code Online (Sandbox Code Playgroud)

这个怎么运作?

应用功能用于调用另一个函数,与给定的上下文中和参数,作为数组提供.min和max函数可以使用任意数量的输入参数:Math.max(val1,val2,...,valN)

所以如果我们打电话:

Math.min.apply(Math, [1,2,3,4]);
Run Code Online (Sandbox Code Playgroud)

apply函数将执行:

Math.min(1,2,3,4);
Run Code Online (Sandbox Code Playgroud)

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

  • 哇,你付出了很多努力来回答你的答案:D (2认同)

A.I*_*A.I 52

最简单的语法,使用新的扩展运算符:

var arr = [1, 2, 3];
var max = Math.max(...arr);
Run Code Online (Sandbox Code Playgroud)

资料来源:Mozilla MDN

  • * 65536对任何人都应该足够* (3认同)
  • _但是,如果数组元素过多, spread (...) 和 apply 要么失败要么返回错误结果_ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/数学/最大值 (2认同)

red*_*r13 37

我不是JS专家,但我想看看这些方法是如何叠加的,所以这对我来说是个好习惯.我不知道这在技术上是否是正确的性能测试方法,但我只是一个接一个地运行它们,正如你在我的代码中看到的那样.

排序和获取第0个值是迄今为止最差的方法(并且它会修改数组的顺序,这可能是不可取的).对于其他人来说,除非你在谈论数以百万计的指数,否则差异可以忽略不计.

使用100,000索引随机数组的五次运行的平均结果:

  • 减少需要4.0392ms才能运行
  • Math.max.apply需要3.3742ms才能运行
  • 排序并获取第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 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)
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,这是这个问题的最佳答案. (7认同)

Ja͢*_*͢ck 36

我发现对于更大的数组(~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;
}
Run Code Online (Sandbox Code Playgroud)

基准测试结果

  • FWIW现在在Chrome 31上出现了84%. (2认同)

Gum*_*mbo 29

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

[267, 306, 108].sort(function(a,b){return b-a;})[0]
Run Code Online (Sandbox Code Playgroud)

  • 啊.我想的更像是:`[...].sort().pop()` (8认同)
  • 我想你也可以排序并获得最后一项......? (3认同)
  • "找到数字需要顺序-n,排序需要在顺序(n log n)到顺序(n平方)之间,取决于使用的排序算法" - http://www.webmasterworld.com/forum91/382.htm (3认同)
  • 还要记住,这会对数组进行排序,这可能是也可能不是所需的副作用。apply 解决方案性能更好,没有副作用。 (3认同)

brr*_*han 27

这个怎么样:

var arr = [1,2,3,4];

var largest = arr.reduce(function(x,y){
       return (x > y) ? x : y;
});

console.log(largest);
Run Code Online (Sandbox Code Playgroud)


Cod*_*oad 8

如何使用Array.reduce

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


luk*_*nis 5

几乎所有答案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;
  }
}
Run Code Online (Sandbox Code Playgroud)

它在我的机子上的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];
}
Run Code Online (Sandbox Code Playgroud)

我已经在这里的博客上写了关于这个问题的文章。

  • 这不公平。我想要答案就在这里,在 SO 上,而不是指向另一个第三方资源的另一个链接。特别是当它与“这里的一切都很糟糕,但是去,看,它在我的博客上太棒了......” (2认同)

小智 5

以简单和手动的方式查找最大值和最小值。这段代码比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;
}
Run Code Online (Sandbox Code Playgroud)


Abh*_*eet 5

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);
Run Code Online (Sandbox Code Playgroud)

  • _但是,如果数组元素过多, spread (...) 和 apply 要么失败要么返回错误结果_ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/数学/最大值 (2认同)

小智 5

要查找数组中的最大数,您只需要使用Math.max(...arrayName);. 它是这样工作的:

let myArr = [1, 2, 3, 4, 5, 6];
console.log(Math.max(...myArr));
Run Code Online (Sandbox Code Playgroud)

要了解更多信息Math.maxhttps : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max


Yas*_*gar 5

简单的一内衬

[].sort().pop()
Run Code Online (Sandbox Code Playgroud)