Tengo una matriz de objetos y quiero comparar esos objetos en una propiedad de objeto específica. Aquí está mi matriz:
var myArray = [
{"ID": 1, "Cost": 200},
{"ID": 2, "Cost": 1000},
{"ID": 3, "Cost": 50},
{"ID": 4, "Cost": 500}
]
Me gustaría concentrarme en el "costo" específicamente y obtener un valor mínimo y máximo. Me doy cuenta de que puedo tomar los valores de costo y enviarlos a una matriz de JavaScript y luego ejecutar Fast JavaScript Max / Min .
Sin embargo, ¿hay una manera más fácil de hacer esto omitiendo el paso de la matriz en el medio y saliendo directamente de las propiedades de los objetos (en este caso, "Costo")?
javascript
arrays
compare
daga
fuente
fuente
lowest=highest=myArray[0]
y luego comenzar el bucle en 1.myArray[0].Cost
, sin embargo. Pero, si no hay un primer elemento, se producirá un error. Por lo tanto, se necesita una verificación adicional, posiblemente deshaciendo el pequeño aumento de rendimiento.var lowestObject; for (...)
yif (tmp < lowest) { lowestObject = myArray[i]; lowest = tmp; }
La reducción es buena para cosas como esta: para realizar operaciones agregadas (como min, max, avg, etc.) en una matriz de objetos y devolver un solo resultado:
... o puede definir esa función interna con la sintaxis de la función ES6:
Si quieres ser lindo, puedes adjuntar esto a la matriz:
Ahora solo puedes decir:
Tenga en cuenta que si tiene la intención de usar esto, no tiene controles completos para cada situación. Si pasa una matriz de tipos primitivos, fallará. Si busca una propiedad que no existe, o si no todos los objetos contienen esa propiedad, obtendrá el último elemento. Esta versión es un poco más voluminosa, pero tiene esos controles:
fuente
prev.Cost
estará indefinido ¿O se inicia como 0?Úselo
sort
, si no le importa que se modifique la matriz.fuente
myArray
, lo que puede no ser esperado.O(nlog(n))
, atravesando una matriz:O(n)
Utilice
Math
funciones y extraiga los valores que deseemap
.Aquí está el jsbin:
https://jsbin.com/necosu/1/edit?js,console
ACTUALIZAR:
Si desea utilizar ES6:
fuente
apply
. Simplemente diga:Math.min(...myArray.map(o => o.Cost))
para encontrar el mínimo yMath.max(...myArray.map(o => o.Cost))
para encontrar el máximo.Creo que la respuesta de Rob W es realmente la correcta (+1), pero solo por diversión: si quisieras ser "inteligente", podrías hacer algo como esto:
o si tuviera una estructura profundamente anidada, podría volverse un poco más funcional y hacer lo siguiente:
Estos podrían currizarse fácilmente en formas más útiles / específicas.
fuente
para Max
por min
fuente
Prueba (
a
es una matriz,f
es un campo para comparar)Mostrar fragmento de código
fuente
Usando Array.prototype.reduce () , puede conectar funciones de comparación para determinar el elemento mínimo, máximo, etc. en una matriz.
fuente
Usando
Math.min
yMath.max
:fuente
Esta es una mejor solución
fuente
Agregando a la respuesta de Tristan Reid (+ usando es6), puede crear una función que acepte una devolución de llamada, que contendrá el operador que desea que se aplique al
prev
ycurr
:Entonces podrías simplemente llamarlo usando:
fuente
Esto se puede lograr con lodash
minBy
ymaxBy
funciones .Lodash
minBy
ymaxBy
documentaciónSolución
fuente
1, forma nativa de script java
2, primero ordenar el objeto y luego obtener el mínimo máximo del objeto ordenado
fuente
Para una solución concisa y moderna, se puede realizar una
reduce
operación sobre la matriz, haciendo un seguimiento de los valores mínimos y máximos actuales, por lo que la matriz solo se repite una vez (lo cual es óptimo).Manifestación:
Mostrar fragmento de código
fuente
Otro, similar a la respuesta de Kennebec, pero todo en una línea:
fuente
Puede usar el objeto Array incorporado para usar Math.max / Math.min en su lugar:
fuente