dojo 从JavaScript数组获取对象值的最大值和最小值

xqkwcwgp  于 2022-12-16  发布在  Dojo
关注(0)|答案(6)|浏览(191)

从JavaScript对象数组中获取最大值和最小值的最佳方法是什么?
给定:

var a = [{x:1,y:0},{x:-1,y:10},{x:12,y:20},{x:61,y:10}];
var minX = Infinity, maxX = -Infinity;
for( var x in a ){
  if( minX > a[x].x )
     minX = a[x].x;
  if( maxX < a[x].x )
     maxX = a[x].x;
}

看起来有点笨拙。有没有更优雅的方法,比如使用dojo?

xuo3flqw

xuo3flqw1#

它不会更有效,但只是为了笑:

var minX = Math.min.apply(Math, a.map(function(val) { return val.x; }));
var maxX = Math.max.apply(Math, a.map(function(val) { return val.x; }));

或者如果你愿意用三行代码:

var xVals = a.map(function(val) { return val.x; });
var minX  = Math.min.apply(Math, xVals);
var maxX  = Math.max.apply(Math, xVals);
pgvzfuti

pgvzfuti2#

使用此示例

var lowest = Number.POSITIVE_INFINITY;
var highest = Number.NEGATIVE_INFINITY;
var tmp;
for (var i=myArray.length-1; i>=0; i--) {
    tmp = myArray[i].Cost;
    if (tmp < lowest) lowest = tmp;
    if (tmp > highest) highest = tmp;
}
console.log(highest, lowest);
klr1opcd

klr1opcd3#

可以使用sort。此方法修改原始数组,因此可能需要克隆它:

var b = [].concat(a); // clones "a"
b.sort(function (a, b) { return a.x - b.x; });
var min = b[0];
var max = b[b.length - 1];
cmssoen2

cmssoen24#

我知道这有点太晚了,但是对于新用户你可以使用lodash。它让事情简单多了。

var a = [{x:1,y:0},{x:-1,y:10},{x:12,y:20},{x:61,y:10}];

var X = [];
var Y = [];
a.map(function (val) {
    X.push(val.x);
    Y.push(val.y);
});

var minX = _.min(X);
var minY = _.min(Y);
var maxX = _.max(X);
var maxY = _.max(Y);

或者你可以用.sort()来完成任务,就像***拖延者***解释的那样。

qcbq4gxm

qcbq4gxm5#

另一个想法是通过将这些值减少为一个值来计算max/min。这在时间复杂度方面与您的版本完全相同,但思考方式略有不同。(从JavaScript 1.8开始支持reduce()。)

var getMax = function (field) {
    return a.reduce(function (acc, c) {
        return Math.max(c[field], acc);
    }, -Infinity);
}

var getMin = function (field) {
    return a.reduce(function (acc, c) {
        return Math.min(c[field], acc);
    }, Infinity);
}

console.log(getMax('x')) //61
console.log(getMin('x')) //-1
console.log(getMax('y')) //20
console.log(getMin('y')) //0
bvn4nwqk

bvn4nwqk6#

您可以使用map功能,但它几乎只是围绕for的语法糖。任何使用reduce的解决方案都会比您的“幼稚”解决方案慢两倍,因为它会为最小值迭代一次数组,为最大值迭代一次数组。就性能而言,您当前的解决方案几乎是最好的。您所能做的就是通过缓存来减少更多的查找。

相关问题