2012-01-12 69 views
5

什麼是在javascript中查找子對象的最大值的優雅方法?找到子對象的最大值

例子:

發現(此處顯示爲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} 
]} 

感謝您的任何建議!

PS:我只想澄清:我當然可以遍歷,但我以爲會有一個更優雅的方式......

+0

縮進會很好 – Ibu 2012-01-12 17:26:40

+0

對不起,不承認... – haemse 2012-01-12 17:30:47

+0

這實際上是一個對象還是一個JSON字符串? – Jivings 2012-01-12 17:55:13

回答

9

有數組原型的reduce方法:

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

另一種解決辦法是這樣的

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

更多「優雅」的方式存在提供的getter工廠的功能和更多的功能庫數組方法。這樣的庫中的解決方案可能看起來像

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

這將做完全一樣的上述之一,但更好的表現。

+0

謝謝,這就是我搜索的! – haemse 2012-01-12 18:29:43

+0

'reduce'是一個偉大的,簡單而優雅的解決方案。謝謝! – 2013-01-09 20:37:07

2

沒有辦法比循環通等,因爲你需要訪問每一個孩子以查看quantity參數是否爲新的最大值。換句話說,問題的複雜性是O(n)。如果孩子被訂購的數量,這將是一個不同的故事(即只得到第一個或最後一個孩子在列表中。)

類似下面的...

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

這種運行後, max是最大數量

注意你沒有給我們正確的json,所以我調整了一下。

下面是一個例子 - 點擊運行,並期待在您的控制檯http://jsfiddle.net/e3dQe/

+0

不錯的建議,thx – haemse 2012-01-12 17:55:47

0

如何最大()方法?但首先你需要收集數組中的所有值...

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

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

var max = values.max() 

沒有更多的優雅,但不同的解決方案。