使用underscore.js从对象数组中获取最小值和最大值

7
假设我有以下结构:
var myArrofObjects =  [
    {prop1:"10", prop2:"20", prop3: "somevalue1"},
    {prop1:"11", prop2:"26", prop3: "somevalue2"},
    {prop1:"67", prop2:"78", prop3: "somevalue3"} ];

我需要基于prop2找到最小值和最大值,所以在这里我的数字将是20和78。

我该如何在Underscore中编写代码来实现这一点?


_.min(), _.max()的含义是获取集合中最小或最大的值。 - Andreas
我可能会使用 each 并设置最小/最大值;这里没有 "min/max",只有 minmax。排序会花费更多时间,但你总是可以进行排序并取第一个/最后一个值。 - Dave Newton
@Andreas。是的,我知道这些函数的存在。然而,我正在询问更具体的问题,请参见问题。 - sarsnake
1
@sarsnake:这是一个假设性的函数,可以同时返回最小值和最大值。但话说回来,为什么“_min”和“_max”不够好呢? - Jon
“更具体的东西”。我有遗漏吗?您正在寻找prop2的最小值和最大值...只需像示例中使用_.max()函数即可。 - Andreas
显示剩余2条评论
5个回答

13

像这样的东西,您实际上不需要使用下划线。

Math.max(...arrayOfObjects.map(elt => elt.prop2));

如果你不是一个ES6的狂热者,那么...
Math.max.apply(0, arrayOfObjects.map(function(elt) { return elt.prop2; }));

对于最小值,使用相同的方法。

如果您想同时找到最大值和最小值,则

arrayOfObjects . 
  map(function(elt) { return elt.prop2; }) .
  reduce(function(result, elt) {
    if (elt > result.max) result.max = elt;
    if (elt < result.min) result.min = elt;
    return result;
  }, { max: -Infinity, min: +Infinity });

如果你想要在旧版浏览器中保持兼容性,那么你确实需要使用Underscore。 - Richard
哦,是哪个旧版浏览器? - user663031
作为注释,对于空数组,max函数返回负无穷大。 - ajliptak

7
您可以使用 _.maxBy 来查找最大值,如下所示。
var maxValObject = _.maxBy(myArrofObjects, function(o) { return o.prop2; });

或者可以使用迭代器简写形式,如下所示:

var maxValObject = _.maxBy(myArrofObjects, 'prop2');

同样地,_.minBy也是如此;
参考文献:https://lodash.com/docs/4.17.4#maxBy

2

使用 _.max 和 _.property:

var max value = _.max(myArrofObjects, _.property('prop2'));

2

使用 _.max 的方法如下:

var max_object = _.max(myArrofObjects, function(object){return object.prop2})

在第二个输入中使用函数将允许您访问对象中的嵌套值。


可能很明显,但请注意您需要执行max_object.prop2以获取最大值(因为这将返回整个对象)。 - Dunc

0

下划线

使用 _.sortBy(..) 按属性对对象进行排序

var sorted = _.sortBy(myArrofObjects, function(item){
    return item.prop2;
});

通过您的prop1属性,您将获得一个排序后的数组,sorted [0]是最小值,sorted [n]是最大值

纯JS

myArrofObjects.sort(function(a, b) {
    return a.prop2 - b.prop2;
})

在第一个例子中,我猜应该是 prop2 - user663031
我并不完全同意这个解决方案。你只是为了找到最小值和最大值而进行了一个可能很昂贵的排序。 - user663031
是的,这个想法是为了将来进行其他操作而拥有一个排序数组。我不知道OP的用例是什么,但这就是我会做的。 - svarog

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