Как я могу найти наибольшее число, содержащееся в массиве JavaScript?
У меня есть простой объект массива JavaScript, содержащий несколько чисел.
[267, 306, 108]
есть ли функция, которая найдет наибольшее число в этом массиве?
21 ответов
вы можете использовать функцию apply, чтобы вызвать математика.Макс!--5-->:
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);
обратите внимание, что первый параметр, контекст, не важен для этих функций, поскольку они статичны, они будут работать независимо от того, что передается как контекст.
самый простой синтаксис, с новыми распространение оператор:
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 ms для выполнения
- математика.max в пределах reduce () взял 6.5804 ms для выполнения
- пользовательская функция findmax 1.6102 ms для выполнения
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
найти максимальное и минимальное значение с помощью 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]);