跨对象数组的最小值/最大值

6

这个问题在SO和互联网上已经被讨论过很多次。但是我想知道是否有一种方法可以利用标准的min/max函数:

Array.max = function(array) {
    return Math.max.apply(Math, array);
};

Array.min = function(array) {
    return Math.min.apply(Math, array);
};

我可以搜索一组对象,例如:

function Vector(x, y, z) { this.x = x; this.y = y; this.z = z; }
var ArrayVector = [ /* lots of data */ ];
var min_x = ArrayVector.x.min(); // or
var max_y = ArrayVector["y"].max();

目前我必须通过循环遍历数组并手动比较对象值,并将每个对象调整到循环的特定需求。更通用的方法会更好(虽然稍微慢一些)。

1个回答

7

您可以对Array.minmax方法进行一些更改,以接受属性名称,并借助于Array.prototype.map提取数组中每个对象的该属性值,然后确定这些提取的值的最大或最小值:

Array.maxProp = function (array, prop) {
  var values = array.map(function (el) {
    return el[prop];
  });
  return Math.max.apply(Math, values);
};

var max_x = Array.maxProp(ArrayVector, 'x');

我只想提一下,Array.prototype.map 方法将在几乎所有现代浏览器中可用,并且它是ECMAScript第五版规范的一部分,但Internet Explorer没有它。不过,您可以轻松地包含一个实现,例如在Mozilla开发者中心找到的实现。

这是一个非常优雅的解决方案。我可以看到它构建了一个新的临时数组,所以我可能需要缓存它,或者谨慎使用它。 - graham.reeds

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