Eu tenho uma matriz de objetos e quero comparar esses objetos em uma propriedade de objeto específica. Aqui está minha matriz:
var myArray = [
{"ID": 1, "Cost": 200},
{"ID": 2, "Cost": 1000},
{"ID": 3, "Cost": 50},
{"ID": 4, "Cost": 500}
]
Gostaria de me concentrar no "custo" especificamente e obter um valor mínimo e máximo. Percebo que posso simplesmente pegar os valores de custo e colocá-los em uma matriz javascript e, em seguida, executar o Fast JavaScript Max / Min .
No entanto, existe uma maneira mais fácil de fazer isso ignorando a etapa do array no meio e saindo das propriedades dos objetos (neste caso, "Custo") diretamente?
javascript
arrays
compare
firedrawndagger
fonte
fonte
lowest=highest=myArray[0]
e, em seguida, iniciar o loop em 1.myArray[0].Cost
, no entanto. Mas, se não houver um primeiro elemento, um erro será gerado. Portanto, uma verificação adicional é necessária, possivelmente desfazendo o pequeno aumento de desempenho.var lowestObject; for (...)
eif (tmp < lowest) { lowestObject = myArray[i]; lowest = tmp; }
A redução é boa para coisas como esta: realizar operações agregadas (como min, max, avg etc.) em uma matriz de objetos e retornar um único resultado:
... ou você pode definir essa função interna com a sintaxe da função ES6:
Se você quiser ser fofo, pode anexar isto ao array:
Agora você pode apenas dizer:
Observe que, se você pretende usar isso, não há verificações completas para todas as situações. Se você passar uma matriz de tipos primitivos, ela falhará. Se você verificar uma propriedade que não existe, ou se nem todos os objetos contiverem essa propriedade, você obterá o último elemento. Esta versão é um pouco mais volumosa, mas tem as seguintes verificações:
fonte
prev.Cost
será indefinido? Ou inicia como 0?Use
sort
, se você não se importar com a modificação do array.fonte
myArray
, o que pode não ser esperado.O(nlog(n))
O(n)
Use
Math
funções e extraia os valores desejadosmap
.Aqui está o jsbin:
https://jsbin.com/necosu/1/edit?js,console
ATUALIZAR:
Se você deseja usar ES6:
fonte
apply
. Basta dizer -Math.min(...myArray.map(o => o.Cost))
para encontrar o mínimo eMath.max(...myArray.map(o => o.Cost))
para encontrar o máximo.Acho que a resposta de Rob W é realmente a certa (+1), mas apenas por diversão: se você quisesse ser "inteligente", poderia fazer algo assim:
ou se você tivesse uma estrutura profundamente aninhada, você poderia ficar um pouco mais funcional e fazer o seguinte:
Isso poderia ser facilmente transformado em formas mais úteis / específicas.
fonte
para Max
por min
fonte
Experimente (
a
é uma matriz,f
é um campo para comparar)Exibir trecho de código
fonte
Usando Array.prototype.reduce () , você pode inserir funções de comparador para determinar o item min, max, etc. em um array.
fonte
Usando
Math.min
eMath.max
:fonte
Esta é uma solução mais melhor
fonte
Adicionando à resposta de Tristan Reid (+ usando es6), você poderia criar uma função que aceita um retorno de chamada, que conterá o operador que você deseja aplicar ao
prev
ecurr
:Então você poderia simplesmente chamá-lo usando:
fonte
Isso pode ser alcançado com lodash
minBy
emaxBy
funções.Lodash's
minBy
emaxBy
documentaçãoSolução
fonte
1, modo
2 de java-script nativo , primeiro classifique o objeto e, em seguida, é fácil obter min max do obj classificado
fonte
Para uma solução concisa e moderna, pode-se executar uma
reduce
operação sobre o array, mantendo o controle dos valores mínimos e máximos atuais, de modo que o array seja iterado apenas uma vez (o que é ótimo).Demo:
Exibir trecho de código
fonte
Outro, semelhante à resposta de Kennebec, mas tudo em uma linha:
fonte
Você pode usar o objeto Array integrado para usar Math.max / Math.min em vez disso:
fonte