我想选择一个对象数组中的最大数字,
例如,我想获取包含最大数字的x
属性(在此示例中,maximum
应为200
):
var myArr = [{x:100,y:200),{x:200,y:500}];
//does not work:
var maximum = Math.max.apply(Math,myArr.x);
答案 0 :(得分:14)
您必须自己从对象中提取属性:
var maximum = Math.max.apply(Math, myArr.map(function(o) { return o.x; }));
使用.map()
迭代数组的元素并返回" x"的值。属性。然后将该结果数组作为参数传递给Math.max()
。
答案 1 :(得分:1)
如果你想用老式的方式做到这一点:
function arrayMax(arr, key){
var m = -Infinity,
cur,
i;
for(i=0; i<arr.length; i++){
cur = arr[i][key]
if(cur > m){
m = cur;
}
}
return m;
}
此函数将对象数组作为第一个参数,将键作为第二个参数。它遍历数组并返回给定键的最大值。
在你的情况下,你会这样称呼它:
var maximum = arrayMax(myArr, "x");
请注意,与Math.max不同,这对于一个(或多个)对象没有定义该键的情况具有弹性,因此:
arrayMax([{y:200}, {x:100, y:100}, {x:300, y:400}], "x");
将返回300
,而Math.max
将返回NaN
(至少在Google Chrome上)。最坏的情况(没有任何对象定义了键),arrayMax
函数返回-Infintity
。
如果要返回具有最大值的对象而不是简单地返回该值,则可以轻松修改该函数:
function arrayMax(arr, key){
var m = -Infinity,
o = null,
cur,
curv,
i;
for(i=0; i<arr.length; i++){
cur = arr[i]
curv = cur[key]
if(curv > m){
m = curv;
o = cur;
}
}
return o;
}
答案 2 :(得分:0)
您需要将map对象数组转换为数字数组:
Math.max.apply(Math,myArr.map(function(o){return o.x;}))
答案 3 :(得分:0)
var myArr = [{x:100,y:200},{x:200,y:500}];
function sortByKeyDesc(array, key) {
return array.sort(function(a, b) {
var x = a[key]; var y = b[key];
return ((x < y) ? 1 : ((x > y) ? -1 : 0));
});
}
console.log(sortByKeyDesc(myArr, "x")[0].x);
首先sort by key value按降序排列然后获取第一个对象的x
属性
答案 4 :(得分:0)
最好完全不使用Math.max。
MDN警告,如果数组中的元素过多,.apply
可能无法正常工作。我不确定“太多”是什么意思。
如果您想安全起见,请使用以下内容:
const maxReduced = myArr
.map(obj => {
return obj.x;
})
.reduce((a, b) => (a.x > b.x ? a : b));
但是,传播(...)和套用都会失败或返回 如果数组包含太多元素,则结果错误,因为它们试图 将数组元素作为函数参数传递。请参阅使用套用和 内置函数以获取更多详细信息。还原解决方案没有 这个问题。
答案 5 :(得分:0)
还有一种方法,我认为它更漂亮。通过使用传播:
Math.max(...array.map((i) => i.x));