Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用下划线.js从对象数组中获取最小值和最大值_Javascript_Arrays_Underscore.js - Fatal编程技术网

Javascript 使用下划线.js从对象数组中获取最小值和最大值

Javascript 使用下划线.js从对象数组中获取最小值和最大值,javascript,arrays,underscore.js,Javascript,Arrays,Underscore.js,假设我有以下结构 var myArrofObjects = [ {prop1:"10", prop2:"20", prop3: "somevalue1"}, {prop1:"11", prop2:"26", prop3: "somevalue2"}, {prop1:"67", prop2:"78", prop3: "somevalue3"} ]; 我需要根据prop2找到最小值和最大值,所以这里的数字是20和78 如何用下划线编写代码来实现此目的?使用u0.max和0

假设我有以下结构

var myArrofObjects =  [
    {prop1:"10", prop2:"20", prop3: "somevalue1"},
    {prop1:"11", prop2:"26", prop3: "somevalue2"},
    {prop1:"67", prop2:"78", prop3: "somevalue3"} ];
我需要根据prop2找到最小值和最大值,所以这里的数字是20和78


如何用下划线编写代码来实现此目的?

使用u0.max和0.property:

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

下划线

使用u.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;
})

像这样的东西,你不需要下划线

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 });
阵列对象。
map(函数(elt){return elt.prop2;})。
减少(功能)(结果,elt){
如果(elt>result.max)result.max=elt;
如果(elt
使用uu.max如下:

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

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

您可以使用u.maxBy来查找最大值,如下所示

var maxValObject = _.maxBy(myArrofObjects, function(o) { return o.prop2; });
或者使用iteratee速记,如下所示

var maxValObject = _.maxBy(myArrofObjects, 'prop2');
同样地u.minBy也一样


Ref:

,我可能只需要
每个
设置最小/最大VAL;没有“最小值/最大值”,只有
min
max
。排序将花费更长的时间,但您始终可以排序并获取第一个/最后一个VAL。@Andreas。是的,我知道这些函数的存在。不过,我想问一些更具体的问题,请参见问题。@Dave,我不确定最小/最大值是多少。我需要一个最小值和一个最大值。如中所示,两个不同的值。我认为问题很清楚。@sarsnake:这是一个假设函数,同时返回最小值和最大值。但是无论如何,为什么
\u min
\u max
不够好呢?在第一个例子中,我想应该是
prop2
。我不太同意这个解决方案。您正在进行一次可能非常昂贵的排序,但只为了找到最小值和最大值。是的,我们的想法是为将来的其他操作创建一个排序数组。我不知道OP的用例,但这就是我要做的。如果你想在旧浏览器中兼容,你确实需要下划线。嗯,哪个旧浏览器?请注意,max返回空数组的无穷大。可能很明显,但请注意,你需要做
max\u object.prop2
来获得最大值(因为它返回整个对象)。