Найти минимальный/максимальный элемент массива в JavaScript
Как легко получить минимальный или максимальный элемент массива в JavaScript?
Пример псевдокода:
let array = [100, 0, 50];
array.min(); // => 0
array.max(); // => 100
У меня есть массив чисел, и я хотел бы быстро получить его минимальное и максимальное значение. Есть ли встроенные методы в JavaScript для этого или мне нужно реализовать их самостоятельно? Спасибо!
5 ответ(ов)
Для нахождения максимального значения в массиве в JavaScript можно использовать метод Math.max
в сочетании с методом apply
. Пример кода выглядит следующим образом:
var max_of_array = Math.max.apply(Math, array);
Этот код позволяет передать массив в качестве аргумента для функции Math.max
, которая возвращает максимальное значение из переданных ей чисел.
Если же вы используете современный JavaScript (ES6 и выше), можно воспользоваться оператором расширения (...
), который делает код более кратким и читаемым:
var max_of_array = Math.max(...array);
Таким образом, у вас есть два варианта для нахождения максимального элемента в массиве. Для более подробного обсуждения можно ознакомиться с этой статьей.
Вы можете использовать оператор расширения (spread operator) в ES6 для передачи элементов массива в функции, которые ожидают отдельные аргументы. Например, для нахождения максимального значения в массиве можно использовать Math.max()
следующим образом:
const array = [10, 2, 33, 4, 5];
console.log(
Math.max(...array) // Выведет 33
);
Аналогично, если вам нужно найти минимальное значение в массиве, вы можете использовать Math.min()
:
console.log(
Math.min(...array) // Выведет 2
);
В этом случае оператор расширения ...
передает элементы массива как отдельные аргументы в функцию Math.max()
или Math.min()
.
Для больших массивов (~10⁷ элементов) функции Math.min
и Math.max
в Node.js могут вызывать следующую ошибку:
RangeError: Maximum call stack size exceeded
Более надежным решением будет избежать добавления каждого элемента в стек вызовов, используя метод reduce
для обработки массива:
function arrayMin(arr) {
return arr.reduce(function (p, v) {
return ( p < v ? p : v );
});
}
function arrayMax(arr) {
return arr.reduce(function (p, v) {
return ( p > v ? p : v );
});
}
Если вас беспокоит производительность, следующий код будет примерно в 3 раза быстрее, чем Math.max.apply
на моем компьютере. Смотрите: https://jsben.ch/JPOyL.
function arrayMin(arr) {
var len = arr.length, min = Infinity;
while (len--) {
if (arr[len] < min) {
min = arr[len];
}
}
return min;
}
function arrayMax(arr) {
var len = arr.length, max = -Infinity;
while (len--) {
if (arr[len] > max) {
max = arr[len];
}
}
return max;
}
Если ваши массивы содержат строки вместо чисел, вам также нужно преобразовать их в числа. Следующий код делает это, но замедляет выполнение примерно в 10 раз на моем компьютере. См. https://jsben.ch/uPipD.
function arrayMin(arr) {
var len = arr.length, min = Infinity;
while (len--) {
if (Number(arr[len]) < min) {
min = Number(arr[len]);
}
}
return min;
}
function arrayMax(arr) {
var len = arr.length, max = -Infinity;
while (len--) {
if (Number(arr[len]) > max) {
max = Number(arr[len]);
}
}
return max;
}
Есть два коротких и простых способа найти максимум в массиве:
let arr = [2, 6, 1, 0];
Способ 1:
let max = Math.max.apply(null, arr);
Способ 2:
let max = arr.reduce(function(a, b) {
return Math.max(a, b);
});
Оба способа эффективно находят максимальное значение в массиве. Первый способ использует метод Math.max
с применением контекста null
, в то время как второй способ применяет метод reduce
, чтобы последовательно сравнивать элементы массива. Выбор способа зависит от предпочтений и стиля кода.
Один из простых способов найти минимальное значение в массиве элементов — использовать функцию reduce
прототипа Array
:
A = [4, 3, -9, -2, 2, 1];
A.reduce((min, val) => val < min ? val : min, A[0]); // вернет -9
Либо можно воспользоваться встроенной функцией Math.min() в JavaScript (спасибо @Tenflex):
A.reduce((min, val) => Math.min(min, val), A[0]);
В этом примере min
устанавливается на A[0]
, а затем проверяется каждое значение в массиве A[1]...A[n]
, является ли оно строго меньше текущего min
. Если A[i] < min
, то значение min
обновляется до A[i]
. Когда все элементы массива обработаны, минимальное значение min
возвращается как результат.
EDIT: Если необходимо сохранить позицию минимального значения, то можно использовать следующий подход:
A = [4, 3, -9, -2, 2, 1];
A.reduce((min, val) => val < min._min ? {_min: val, _idx: min._curr, _curr: min._curr + 1} : {_min: min._min, _idx: min._idx, _curr: min._curr + 1}, {_min: A[0], _idx: 0, _curr: 0}); // вернет { _min: -9, _idx: 2, _curr: 6 }
В этом варианте мы сохраняем не только минимальное значение, но и его индекс в массиве.
Где найти документацию по форматированию даты в JavaScript?
В чем разница между String.slice и String.substring?
Проверка соответствия строки регулярному выражению в JS
Существует ли ссылка на "последнюю" библиотеку jQuery в Google APIs?
Как создать диалог с кнопками "Ок" и "Отмена"