找到子对象的最大值

时间:2012-01-12 17:25:06

标签: javascript json max

在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:只是为了澄清:当然我可以循环,但我认为会有更优雅的方式...

3 个答案:

答案 0 :(得分:10)

Array原型的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工厂函数和更多的Array方法。这种库的解决方案可能看起来像

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

与上述内容完全相同,但更好地表达。

答案 1 :(得分: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/

答案 2 :(得分:0)

max()方法怎么样?但首先你需要收集数组中的所有值...

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

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

var max = values.max()

不是更优雅,而是另一种解决方案。