2012-01-12 28 views
5

Jaki byłby elegancki sposób na znalezienie maksymalnej wartości obiektu podrzędnego w javascript?znajdź maksymalną wartość obiektu podrzędnego

Przykład:

znaleźć maksymalną wartość ilości tego obiektu (tu pokazany jako 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} 
]} 

dziękuję za wszelkie rady!

PS: tylko w celu wyjaśnienia: oczywiście może pętli, ale pomyślałem, że byłoby bardziej elegancki sposób ...

+0

Wcięcie byłoby miło – Ibu

+0

Przykro mi, nie rozpoznałem ... – haemse

+0

Czy to faktycznie obiekt lub ciąg znaków JSON? – Jivings

Odpowiedz

9

Jest metoda reduce prototypu tablicy:

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

Innym rozwiązaniem byłoby coś

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

Dla bardziej „elegancki” sposób istnieją biblioteki funkcyjne, które zapewniają funkcje fabryczne getter i więcej Metody tablicowe. Rozwiązanie z taką biblioteką może wyglądać tak, jak zrobiłoby to dokładnie to samo, co powyżej, ale ładniej wyrażone.

+0

dziękuję, to jest to, czego szukałem! – haemse

+0

'reduce' to świetne, proste i eleganckie rozwiązanie. Dzięki! –

2

Nie ma sposobu innego niż zapętlenie thru, bo trzeba odwiedzić każde dziecko w celu sprawdzenia, czy parametr quantity jest nowym maks. Innymi słowy, złożoność problemu to O (n). Jeśli dzieci zostały uporządkowane według ilości, to byłaby inna historia (czyli po prostu pierwszego lub ostatniego potomka na liście.)

coś następujących ...

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; 
}); 

Po tym skończy, max to maksymalna ilość:

Uwaga, nie podałeś nam poprawnego jsona, więc trochę go poprawiłem.

Oto przykład - polecenie Uruchom i spojrzeć w konsoli http://jsfiddle.net/e3dQe/

+0

miła sugestia, thx – haemse

0

Jak o sposobie max()? Ale najpierw musisz zebrać wszystkie wartości w tablicy ...

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

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

var max = values.max() 

Nieco bardziej eleganckie, ale inne rozwiązanie.

Powiązane problemy