it-swarm.com.ru

Как я могу найти наибольшее число, содержащееся в массиве JavaScript?

У меня есть простой объект JavaScript Array, содержащий несколько чисел.

[267, 306, 108]

Есть ли функция, которая найдет наибольшее число в этом массиве?

193
dotty

Resig на помощь:

Array.max = function( array ){
    return Math.max.apply( Math, array );
};
300
Crescent Fresh

Вы можете использовать функцию apply, чтобы вызвать Math.max :

var array = [267, 306, 108];
var largest = Math.max.apply(Math, array); // 306

Как это устроено?

Функция apply используется для вызова другой функции с заданным контекстом и аргументами, представленными в виде массива. Функции min и max могут принимать произвольное количество входных аргументов: Math.max (val1, val2, ..., valN)

Так что если мы позвоним:

Math.min.apply(Math, [1,2,3,4]);

Функция apply выполнит:

Math.min(1,2,3,4);

Обратите внимание, что первый параметр, контекст, не важен для этих функций, так как они являются статическими, они будут работать независимо от того, что передается в качестве контекста.

189
CMS

Самый простой синтаксис с новым оператором распространения :

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

Источник: Mozilla MDN

41
A.I

Я обнаружил, что для больших массивов (~ 100 тыс. Элементов) на самом деле стоит просто итерировать массив с простым циклом 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;
}

Результаты тестов

35
Ja͢ck

Я не эксперт по JS, но я хотел посмотреть, как складываются эти методы, так что это была хорошая практика для меня. Я не знаю, является ли это технически правильным способом тестирования производительности, но я просто запускал их один за другим, как вы можете видеть в моем коде.

Сортировка и получение 0-го значения является наихудшим методом (и он изменяет порядок вашего массива, что может быть нежелательно). Для остальных разница незначительна, если вы не говорите о миллионах индексов.

Средние результаты пяти запусков с массивом случайных чисел из 100 000 индексов:

  • уменьшить взял 4,0392мс запустить
  • Math.max.apply потребовалось 3,3742 мс для запуска
  • для сортировки и получения 0-го значения потребовалось 67,4724мс для запуска
  • Math.max в рамках Reduce () потребовалось 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)
34
redOctober13

Вы можете отсортировать массив в порядке убывания и получить первый элемент:

[267, 306, 108].sort(function(a,b){return b-a;})[0]
27
Gumbo

Как насчет этого:

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

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

console.log(largest);
22
brroshan

как насчет использования Array.reduce

[0,1,2,3,4].reduce(function(previousValue, currentValue){
  return Math.max(previousValue,currentValue);
});
8
CodeToad

Почти во всех ответах используется 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];
}

Я написал об этом вопросе в своем блоге здесь .

4
lukas.pukenis

Нахождение максимального и минимального значения простым и ручным способом. Этот код намного быстрее, чем Math.max.apply; Я пробовал до 1000 тысяч номеров в массиве.

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;
}
4
Yaser Ranjha

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

4
Abhijeet

Да, конечно, существуют: Math.max.apply(null,[23,45,67,-45]) и результат return 67;

3
user3702000

Найти наибольшее число в многомерном массиве

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;
1
Liveindream

Вы также можете расширить Array, чтобы иметь эту функцию и сделать ее частью каждого массива.

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

console.log( myArray.max() );
1
Izz

Я только начал с 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];
  }
}
1
Jakub Karki

Вы можете попробовать это,

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);
1
Aasha joney

Вы также можете использовать 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

1
Benny Neugebauer

Не забывайте, что перенос можно выполнить с помощью Function.prototype.bind, предоставляя вам «все-родную» функцию .

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

Использование - 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);

1
Siddharth

Попробуй это

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

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

  return currentLongest
}
0
Toufiq

Запустите это:

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

А теперь попробуйте [3,10,2].max() возвращает 10

0
RegarBoy

Что касается @ Quasimondo's comment , который, по-видимому, был в основном пропущен, то, как показано ниже, лучшая производительность, как показано здесь: https://jsperf.com/finding-maximum-element-in -an-массив . Обратите внимание, что хотя для рассматриваемого массива производительность может не оказать существенного влияния, для больших массивов производительность становится более важной, и снова как отмечалось использование 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;
}
0
James Ray

Найти максимальное и минимальное значение, используя Bubble Sort

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

0
Mano