У меня есть это:
var arr = [0, 21, 22, 7];
Каков наилучший способ вернуть индекс наибольшего значения в другую переменную?
javascript
arrays
max
Стивен
источник
источник
Ответы:
Это, вероятно, лучший способ, поскольку он надежен и работает на старых браузерах:
Также есть однострочный:
Он выполняет в два раза больше сравнений, чем необходимо, и
RangeError
, тем не менее, будет вызывать большие массивы. Я бы придерживался функции.источник
const max = arr.reduce((m, n) => Math.max(m, n))
, тогда индексы максимума равны[...arr.keys()].filter(i => arr[i] === max)
.[...arr.keys()]
выводит ошибку:unexpected token
Одной строкой и, возможно, быстрее
arr.indexOf(Math.max.apply(Math, arr))
:Куда:
iMax
- лучший индекс на данный момент (индекс максимального элемента на первой итерации,iMax = 0
потому что второй аргументreduce()
равен0
, мы не можем пропустить второй аргументreduce()
в нашем случае)x
- текущий проверенный элемент из массиваi
- текущий протестированный индексarr
- наш массив ([0, 21, 22, 7]
)О
reduce()
методе (из «JavaScript: Полное руководство» Дэвида Фланагана):источник
arr.reduce((bestIndexSoFar, currentlyTestedValue, currentlyTestedIndex, array) => currentlyTestedValue > array[bestIndexSoFar] ? currentlyTestedIndex : bestIndexSoFar, 0);
, которая может быть описана как: итерация массива , начиная с индекса 0 (второй параметр), если currentlyTestedValue выше , чем значение элемента в bestIndexSoFar , а затем вернуть currentlyTestedIndex к следующей итерации в качестве bestIndexSoFar .this.methods.reduce((methodIndex, currentMethod, currentMethodIndex, methods) => currentMethod.price <= methods[methodIndex].price ? currentMethodIndex : methodIndex, 0)
.Вот еще одно решение, если вы используете ES6 с оператором распространения:
источник
Если не ошибаюсь, я бы сказал, чтобы написать свою функцию.
источник
Если вы используете подчеркивание, вы можете использовать этот красивый короткий однострочник:
Сначала он найдет значение самого большого элемента в массиве, в данном случае 22. Затем он вернет индекс, где 22 находится внутри массива, в данном случае 2.
источник
Другое решение макс с использованием
reduce
:Это возвращается,
[5e-324, -1]
если массив пуст. Если вам нужен только индекс, поместите[1]
после.Мин. Через (Изменить на
>
иMAX_VALUE
):источник
РЕДАКТИРОВАТЬ: Несколько лет назад я дал ответ на этот вопрос, который был грубым, слишком конкретным и слишком сложным. Так что редактирую. Я предпочитаю функциональные ответы выше из-за их аккуратности, но не из-за их удобочитаемости; но если бы я был более знаком с javascript, то они мне тоже могли бы понравиться.
Псевдокод:
Отслеживать индекс, который содержит наибольшее значение. Предположим, что индекс 0 является наибольшим изначально. Сравните с текущим индексом. Обновите индекс с наибольшим значением при необходимости.
Код:
источник
перейти
array
кhaystack
иMath.max(...array)
кneedle
. Это даст все максимальные элементы массива, и он будет более расширяемым (например, вам также нужно найти минимальные значения)источник
Если вы создадите копию массива и отсортируете ее по убыванию, первый элемент копии будет самым большим. Затем вы можете найти его индекс в исходном массиве.
Сложность по времени составляет O (n) для копии, O (n * log (n)) для сортировки и O (n) для indexOf.
Если вам нужно сделать это быстрее, ответ Ry - O (n).
источник
источник
Стабильная версия этой функции выглядит так:
источник