У меня есть простой объект JavaScript Array, содержащий несколько чисел.
[267, 306, 108]
Есть ли функция, которая найдет наибольшее число в этом массиве?
javascript
algorithm
arrays
max
рехнувшийся
источник
источник
Math.max(...[267, 306, 108]);
Ответы:
Resig на помощь:
Предупреждение : поскольку на некоторых виртуальных машинах максимальное количество аргументов составляет всего 65535 , используйте цикл for, если вы не уверены, что массив настолько мал.
источник
apply
звонка может очень легко отмыть это.RangeError: Maximum call stack size exceeded.
Вы можете использовать функцию apply, чтобы вызвать Math.max :
Как это устроено?
Функция apply используется для вызова другой функции с заданным контекстом и аргументами, представленными в виде массива. Функции min и max могут принимать произвольное количество входных аргументов: Math.max (val1, val2, ..., valN)
Так что если мы позвоним:
Функция apply выполнит:
Обратите внимание, что первый параметр, контекст, не важен для этих функций, так как они являются статическими, они будут работать независимо от того, что передается в качестве контекста.
источник
Самый простой синтаксис с новым оператором распространения :
Источник: Мозилла MDN
источник
Я не эксперт по JS, но я хотел посмотреть, как складываются эти методы, так что это была хорошая практика для меня. Я не знаю, является ли это технически правильным способом тестирования производительности, но я просто запускал их один за другим, как вы можете видеть в моем коде.
Сортировка и получение 0-го значения - безусловно худший метод (и он изменяет порядок вашего массива, что может быть нежелательно). Для остальных разница незначительна, если вы не говорите о миллионах индексов.
Средние результаты пяти прогонов с массивом случайных чисел из 100 000 индексов:
источник
jsperf tests
для вышеупомянутогоЯ обнаружил, что для больших массивов (~ 100 тыс. Элементов) на самом деле стоит просто итерировать массив с простым
for
циклом, выполняя ~ 30% лучше, чемMath.max.apply()
:Результаты тестов
источник
Вы можете отсортировать массив в порядке убывания и получить первый элемент:
источник
sort(function(a,b){return b-a;})
[...].sort().pop()
Как насчет этого:
источник
как насчет использования Array.reduce ?
источник
-Infinity
.Почти все ответы используют,
Math.max.apply()
что приятно и красиво, но имеет ограничения.Аргументы функции помещаются в стек, который имеет обратную сторону - предел. Так что, если ваш массив больше, чем лимит, он потерпит неудачу с
RangeError: Maximum call stack size exceeded.
Чтобы найти размер стека вызовов, я использовал этот код:
Он оказался самым большим на FireFox на моей машине - 591519 . Это означает, что если ваш массив содержит более 591519 элементов,
Math.max.apply()
это приведет к RangeError .Лучшее решение этой проблемы - итеративный способ (кредит: https://developer.mozilla.org/ ):
Я написал об этом вопросе в своем блоге здесь .
источник
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
источник
Найти максимальное и минимальное значение простым и ручным способом. Этот код намного быстрее, чем
Math.max.apply
; Я пробовал до 1000 тысяч номеров в массиве.источник
findmax()
дает неверный результат, если в массиве есть только отрицательные числа;findmin()
дает неверный результат для пустого массива.Чтобы найти наибольшее число в массиве, который вам просто нужно использовать
Math.max(...arrayName);
, он работает так:Чтобы узнать больше о
Math.max
: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/maxисточник
Да, конечно, существуют:
Math.max.apply(null,[23,45,67,-45])
и результат возврата67
;источник
Простой один лайнер
источник
Не забывайте, что обертывание может быть сделано
Function.prototype.bind
, давая вам «все-родную» функцию .источник
Вы также можете расширить
Array
эту функцию и сделать ее частью каждого массива.источник
Вы также можете использовать forEach :
источник
Использование -
Array.prototype.reduce()
это круто![267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val)
где acc = аккумулятор и val = текущее значение ;
источник
Вы можете попробовать это,
источник
Я только начал с JS, но я думаю, что этот метод будет хорош:
источник
array
содержит только отрицательные числа.Найти наибольшее число в многомерном массиве
источник
var tmax = Math.max.apply(Math, max)
, или еще лучше использовать функцию закрытия цикла, например, в stackoverflow.com/a/54980012/7438857 . С этой модификацией лучше ответить на отдельный вопрос, как «найти наибольшее число в многомерном массиве», или на stackoverflow.com/questions/32616910/… . WIP: jsfiddle.net/jamesray/3cLu9for/8 .Запустите это:
А теперь попробуй
[3,10,2].max()
возвраты10
источник
Найти максимальное и минимальное значение, используя Bubble Sort
источник
Попробуй это
источник
В соответствии с комментарием @ Quasimondo , который, по-видимому, в значительной степени упущен, приведенная ниже, похоже, имеет лучшую производительность, как показано здесь: https://jsperf.com/finding-maximum-element-in-an-array . Обратите внимание, что хотя для рассматриваемого массива производительность может не оказать существенного влияния, для больших массивов производительность становится более важной, и, как уже отмечалось, использование
Math.max()
даже не работает, если длина массива превышает 65535. См. Также этот ответ .источник
Рекурсивный подход к тому, как это сделать, используя троичные операторы
источник
Одно
for/of
решение петли:источник