寻找子对象的最大值

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:为了澄清:当然我可以循环遍历,但我认为应该有更加优美的方式...


抱歉,我没有识别出来... - haemse
这实际上是一个对象还是一个JSON字符串? - Jivings
这是一个 JSON,表示将被搜索最大值的对象。 - haemse
3个回答

11

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

这将完全与上述代码相同,但表达更加优美。


reduce 是一种非常好的、简单而优雅的解决方案。谢谢! - Ryan Burney

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

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

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

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

var max = values.max()

并不更加优雅,但是是另一种解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接