2012-01-12 30 views
5

¿Cuál sería una manera elegante de encontrar el valor máximo de un objeto secundario en javascript?encontrar el valor máximo de un objeto secundario

Ejemplo:

encontrar el valor máximo de la cantidad de este objeto (aquí se muestra como JSON):

{"density":[ 
    {"price":1.22837, "quantity":48201}, 
    {"price":1.39837, "quantity":28201}, 
    {"price":1.40107, "quantity":127011}, 
    {"price":1.5174, "quantity":75221}, 
    {"price":1.60600, "quantity":53271} 
]} 

gracias por cualquier consejo!

PS: sólo para aclarar: Por supuesto que podría recorrer, pero pensé que habría una forma más elegante ...

+0

sangrado sería bueno – Ibu

+0

lo siento, no reconocí ... – haemse

+0

¿Es realmente un objeto o una cadena JSON? – Jivings

Respuesta

9

Hay el método reduce del prototipo de matriz:

var arr = JSON.parse(objstring)["density"]; 
var max = arr.reduce(function(a, b) { 
    return Math.max(a, b.quantity); 
}, 0); 

Otra solución sería algo así como

var max = Math.max.apply(null, arr.map(function(item){ 
    return item["quantity"]; 
})); 

Para más formas "elegantes" hay bibliotecas funcionales que proporcionan funciones de fábrica getter y más Métodos de matriz Una solución con una biblioteca de este tipo podría parecerse a

var max = arr.get("quantity").max(); 

que hacer exactamente lo mismo que el anterior, pero mejor expresado.

+0

gracias, esto es lo que he buscado! – haemse

+0

'reduce' es una solución genial, simple y elegante. ¡Gracias! –

2

No hay manera que no sea a través de un bucle, porque es necesario para visitar todos los niños para ver si el parámetro quantity es el nuevo máximo. En otras palabras, la complejidad del problema es O (n). Si los niños fueron ordenados por cantidad, sería una historia diferente (es decir, acaba de obtener el primer o último elemento secundario de la lista.)

algo como lo siguiente ...

var json = '{"density":[{"price":1.22837,"quantity":48201},{"price":1.39837,"quantity":28201},{"price":1.40107,"quantity":127011},{"price":1.5174,"quantity":75221},{"price":1.60600,"quantity":53271}]}' 

var x = JSON.parse(json); 
var max = 0; 

x.density.forEach(function(item){ 
    if (item.quantity > max) max = item.quantity; 
}); 

Después de esto funciona, max es la cantidad máxima

tenga en cuenta que no nos dio JSON correcta, así que lo pellizqué un poco.

Aquí es un ejemplo - haga clic en ejecución y buscar en su consola http://jsfiddle.net/e3dQe/

+0

buena sugerencia, thx – haemse

0

¿Qué tal el método max()? Pero primero que tendría que recoger todos los valores en una matriz ...

var obj = // your object 
var values = new Array(); 

for (key in obj) { 
    values.push(obj[key]) 
} 

var max = values.max() 

No mucho más elegante, pero una solución diferente.

Cuestiones relacionadas