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

How do i use Math.max with an array of objects?

本文关键字:数组 一起 对象 Math max      更新时间:2023-09-26

我想在对象数组中选择最大的数字,因此,例如,我想获得包含最大数字的x属性(在本例中,maximum应该是200):

var myArr = [{x:100,y:200},{x:200,y:500}];
//does not work:
var maximum = Math.max.apply(Math,myArr.x);

您必须自己从对象中提取属性:

var maximum = Math.max.apply(Math, myArr.map(function(o) { return o.x; }));

它使用.map()迭代数组的元素,并返回"x"属性的值。然后将该结果数组作为参数传递给Math.max()

既然=>功能已经广泛可用,那么它会更短:

var maximum = Math.max.apply(Math, myArr.map(o => o.x));

当然,仍然在做几乎完全相同的事情。

还有一种方式,我觉得它更漂亮。通过使用排列:

Math.max(...array.map((i) => i.x));
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);

首先按键值降序排序,然后获得第一个对象的x属性

如果你想用老式的方式:

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;
}

您需要将对象数组映射到数字数组:

Math.max.apply(Math,myArr.map(function(o){return o.x;}))

你最好不要使用Math.max。

MDN警告说,如果数组中的元素过多,.apply可能无法工作。我不知道"太多"是什么意思。

如果你想安全,可以使用这样的东西:

const maxReduced = myArr
  .map(obj => {
    return obj.x;
  })
  .reduce((a, b) => (a.x > b.x ? a : b));

MDN警告

但是,spread(…)和apply都将失败或返回如果数组中的元素太多,则会出现错误的结果,因为它们试图将数组元素作为函数参数传递。请参阅使用应用程序和内置函数了解更多详细信息。reduce解决方案没有这个问题。

const maximum = myArr.reduce((s, obj)=>{
  return Math.max(s, obj.x)
}, 0)

原因-

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max由于spread(…)和apply试图将数组元素作为函数参数传递,因此如果数组的元素过多,则它们将失败或返回错误的结果。有关更多详细信息,请参阅使用应用程序和内置函数。reduce解决方案不存在此问题