Как я могу найти наибольшее число, содержащееся в массиве JavaScript?
У меня есть простой объект массива JavaScript, содержащий несколько чисел.
[267, 306, 108]
есть ли функция, которая найдет наибольшее число в этом массиве?
21 ответ:
вы можете использовать функцию apply, чтобы вызвать математика.Макс:
var array = [267, 306, 108]; var largest = Math.max.apply(Math, array); // 306
как это работает?
The применить функция используется для вызова другой функции с заданным контекстом и аргументами, предоставленными в виде массива. Функции min и Max могут принимать произвольное количество аргументов: математика.Макс(val1, val2, ..., valN)
Так что если мы позвоним:
Math.min.apply(Math, [1,2,3,4]);
функция apply выполнит:
Math.min(1,2,3,4);
обратите внимание, что первый параметр, контекст, не важен для этих функций, так как они статичны, они будут работать независимо от того, что передается в качестве контекста.
самый простой синтаксис, с новыми распространение оператор:
var arr = [1, 2, 3]; var max = Math.max(...arr);
источник : Mozilla MDN
я обнаружил, что для больших массивов (~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; }
Я не эксперт JS, но я хотел посмотреть, как эти методы складываются, так что это была хорошая практика для меня. Я не знаю, является ли это технически правильным способом проверки производительности, но я просто запускал их один за другим, как вы можете видеть в моем коде.
сортировка и получение 0-го значения на сегодняшний день является худшим методом (и он изменяет порядок вашего массива, что может быть нежелательно). Для остальных разница незначительна, если вы не говорите о миллионах индексы.
средние результаты пяти запусков с массивом 100 000 индексов случайных чисел:
- уменьшить принял 4.0392 МС для выполнения
- математика.максимум.подать заявку взял 3.3742 ms для выполнения
- сортировка и получение 0-го значения заняло 67.4724 МС для выполнения
- математика.МАКС в пределах уменьшения () взял 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)
вы можете отсортировать массив в порядке убывания и получите первый пункт:
[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);
Как насчет использования массив.уменьшить ?
[0,1,2,3,4].reduce(function(previousValue, currentValue){ return Math.max(previousValue,currentValue); });
находя максимальное и минимальное значение легкий и ручной путь. Этот код намного быстрее, чем
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]; }
я написал об этом вопросе в своем блоге здесь.
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);
Не забывайте, что обертывание может быть сделано с
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() );
найти наибольшее число в многомерном массиве
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;
вы также можете использовать 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);
Я просто начал с 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]; } }
выполнить это:
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]);