11

Найти минимальный/максимальный элемент массива в JavaScript

12

Как легко получить минимальный или максимальный элемент массива в JavaScript?

Пример псевдокода:

let array = [100, 0, 50];

array.min(); // => 0
array.max(); // => 100

У меня есть массив чисел, и я хотел бы быстро получить его минимальное и максимальное значение. Есть ли встроенные методы в JavaScript для этого или мне нужно реализовать их самостоятельно? Спасибо!

5 ответ(ов)

4

Для нахождения максимального значения в массиве в JavaScript можно использовать метод Math.max в сочетании с методом apply. Пример кода выглядит следующим образом:

var max_of_array = Math.max.apply(Math, array);

Этот код позволяет передать массив в качестве аргумента для функции Math.max, которая возвращает максимальное значение из переданных ей чисел.

Если же вы используете современный JavaScript (ES6 и выше), можно воспользоваться оператором расширения (...), который делает код более кратким и читаемым:

var max_of_array = Math.max(...array);

Таким образом, у вас есть два варианта для нахождения максимального элемента в массиве. Для более подробного обсуждения можно ознакомиться с этой статьей.

3

Вы можете использовать оператор расширения (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().

2

Для больших массивов (~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;
}
0

Есть два коротких и простых способа найти максимум в массиве:

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, чтобы последовательно сравнивать элементы массива. Выбор способа зависит от предпочтений и стиля кода.

0

Один из простых способов найти минимальное значение в массиве элементов — использовать функцию 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 }

В этом варианте мы сохраняем не только минимальное значение, но и его индекс в массиве.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь