如何找到JavaScript数组中包含的最大数字?

2020/10/15 16:41 · javascript ·  · 0评论

我有一个包含一些数字的简单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);

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

最简单的语法,使用新的spread运算符

var arr = [1, 2, 3];
var max = Math.max(...arr);

资料来源:Mozilla MDN

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

到目前为止,排序和获取0th值是最糟糕的方法(它会修改数组的顺序,这可能是不希望的)。对于其他情况,除非您谈论数百万个索引,否则差异可以忽略不计。

五次运行的平均结果,其中包含100,000个索引的随机数数组:

  • 减少花费4.0392毫秒运行
  • Math.max.apply花了3.3742毫秒运行
  • 排序并获得第0个值了67.4724毫秒运行
  • reduce()中的Math.max运行需要6.5804毫秒
  • 定制findmax功能了1.6102毫秒运行

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循环来迭代数组,其效果要好于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;
}

基准结果

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

[267, 306, 108].sort(function(a,b){return b-a;})[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);
});

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;
}

几乎所有答案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];
}

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

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

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

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

简单的一线

[].sort().pop()

是的,当然存在Math.max.apply(null,[23,45,67,-45]) ,并且结果是return 67

不要忘记可以使用自动换行功能Function.prototype.bind,为您提供“全天然”功能

var aMax = Math.max.apply.bind(Math.max, Math);
aMax([1, 2, 3, 4, 5]); // 5

您还可以扩展Array为具有此功能,并使它成为每个数组的一部分。

Array.prototype.max = function(){return Math.max.apply( Math, this )};
myArray = [1,2,3];

console.log( myArray.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

使用-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);

你可以试试看

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);

我刚开始使用JavaScript,但是我认为这种方法会很好:

var array = [34, 23, 57, 983, 198];
var score = 0;

for(var i = 0; i = array.length; i++) {
  if(array[ i ] > score) {
    score = array[i];
  }
}

运行这个:

Array.prototype.max = function(){
    return Math.max.apply( Math, this );
};

现在尝试[3,10,2].max()返回10

使用冒泡排序查找最大值和最小值

    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]);

尝试这个

function largestNum(arr) {
  var currentLongest = arr[0]

  for (var i=0; i< arr.length; i++){
    if (arr[i] > currentLongest){
      currentLongest = arr[i]
    }
  }

  return currentLongest
}

根据@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;
}

使用三元运算符的递归方法

const findMax = (arr, max, i) => arr.length === i ? max :
  findMax(arr, arr[i] > max ? arr[i] : max, ++i)

const arr = [5, 34, 2, 1, 6, 7, 9, 3];
const max = findMax(arr, arr[0], 0)
console.log(max);

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);

在多维数组中找到最大的数

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;

我的解决方案返回数组中的最大数字。

const largestOfFour = arr => {
    let arr2 = [];
    arr.map(e => {
        let numStart = -Infinity;
        e.forEach(num => {
            if (num > numStart) {
                numStart = num;

            }
        })
        arr2.push(numStart);
    })
    return arr2;
}
let array = [267, 306, 108]
let longest = Math.max(...array);
本文地址:http://javascript.askforanswer.com/ruhezhaodaojavascriptshuzuzhongbaohandezuidashuzi.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!