在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 :(得分: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()
不是更优雅,而是另一种解决方案。