Eu tenho isto:
var arr = [0, 21, 22, 7];
Qual é a melhor maneira de retornar o índice do valor mais alto para outra variável?
javascript
arrays
max
Stephen
fonte
fonte
Respostas:
Esta é provavelmente a melhor maneira, pois é confiável e funciona em navegadores antigos:
Há também este one-liner:
Ele realiza o dobro de comparações necessárias e,
RangeError
no entanto, gera uma matriz grande. Eu manteria a função.fonte
const max = arr.reduce((m, n) => Math.max(m, n))
, então os índices do máximo são[...arr.keys()].filter(i => arr[i] === max)
.[...arr.keys()]
gera um erro:unexpected token
Em uma linha e provavelmente mais rápido que
arr.indexOf(Math.max.apply(Math, arr))
:Onde:
iMax
- o melhor índice até agora (o índice do elemento max até o momento, na primeira iteraçãoiMax = 0
porque o segundo argumentoreduce()
é0
, não podemos omitir o segundo argumentoreduce()
no nosso caso)x
- o elemento atualmente testado da matrizi
- o índice atualmente testadoarr
- nossa matriz ([0, 21, 22, 7]
)Sobre o
reduce()
método (de "JavaScript: The Definitive Guide", de David Flanagan):fonte
arr.reduce((bestIndexSoFar, currentlyTestedValue, currentlyTestedIndex, array) => currentlyTestedValue > array[bestIndexSoFar] ? currentlyTestedIndex : bestIndexSoFar, 0);
, o que pode ser descrito como: iterar a matriz a partir de índice 0 (segundo parâmetro), se currentlyTestedValue é maior do que o valor do elemento no bestIndexSoFar , em seguida, voltar a currentlyTestedIndex para a iteração seguinte como a bestIndexSoFar .this.methods.reduce((methodIndex, currentMethod, currentMethodIndex, methods) => currentMethod.price <= methods[methodIndex].price ? currentMethodIndex : methodIndex, 0)
.Aqui está outra solução: se você estiver usando o ES6 usando o operador spread:
fonte
A menos que eu esteja enganado, eu diria que é escrever sua própria função.
fonte
Se você estiver utilizando sublinhado, poderá usar esta bela linha curta:
Ele primeiro encontrará o valor do maior item da matriz, neste caso 22. Em seguida, retornará o índice de onde 22 está dentro da matriz, neste caso 2.
fonte
Outra solução do max usando
reduce
:Isso retorna
[5e-324, -1]
se a matriz estiver vazia. Se você quiser apenas o índice, coloque[1]
depois.Min via (Alterar para
>
eMAX_VALUE
):fonte
Edição: Anos atrás, eu dei uma resposta para isso que era nojento, específico demais e complicado demais. Então, eu estou editando. Eu sou a favor das respostas funcionais acima por seu fator elegante, mas não por sua legibilidade; mas se eu estivesse mais familiarizado com o javascript, talvez também gostasse deles.
Pseudo-código:
Índice de faixas que contém o maior valor. Suponha que o índice 0 seja o maior inicialmente. Compare com o índice atual. Atualize o índice com o maior valor, se necessário.
Código:
fonte
passar
array
parahaystack
eMath.max(...array)
paraneedle
. Isso fornecerá todos os elementos máximos da matriz e é mais extensível (por exemplo, você também precisa encontrar valores mínimos)fonte
Se você criar uma cópia da matriz e ordená-la em ordem decrescente, o primeiro elemento da cópia será o maior. Do que você pode encontrar o seu índice na matriz original.
A complexidade de tempo é O (n) para a cópia, O (n * log (n)) para classificação e O (n) para o indexOf.
Se você precisar fazer isso mais rapidamente, a resposta de Ry é O (n).
fonte
fonte
Uma versão estável desta função é semelhante a esta:
fonte
Simples
fonte