如何将Math.max与对象数组一起使用?

时间:2016-01-12 17:21:26

标签: javascript

我想选择一个对象数组中的最大数字, 例如,我想获取包含最大数字的x属性(在此示例中,maximum应为200):

var myArr = [{x:100,y:200),{x:200,y:500}];

//does not work:
var maximum = Math.max.apply(Math,myArr.x);

6 个答案:

答案 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));

MDN Warning

  

但是,传播(...)和套用都会失败或返回   如果数组包含太多元素,则结果错误,因为它们试图   将数组元素作为函数参数传递。请参阅使用套用和   内置函数以获取更多详细信息。还原解决方案没有   这个问题。

答案 5 :(得分:0)

还有一种方法,我认为它更漂亮。通过使用传播:

Math.max(...array.map((i) => i.x));