【问题标题】:Get the min and max from array of objects with underscore.js使用 underscore.js 从对象数组中获取最小值和最大值
【发布时间】:2015-10-26 17:29:45
【问题描述】:

假设我有以下结构

var myArrofObjects =  [
    {prop1:"10", prop2:"20", prop3: "somevalue1"},
    {prop1:"11", prop2:"26", prop3: "somevalue2"},
    {prop1:"67", prop2:"78", prop3: "somevalue3"} ];

我需要根据 prop2 找到最小值和最大值,所以这里我的数字是 20 和 78。

如何在 Underscore 中编写代码来做到这一点?

【问题讨论】:

  • 我可能只是 each 并设置最小/最大 vals;只有minmax 没有“最小/最大”。排序会花费更长的时间,但您始终可以排序并获取第一个/最后一个值。
  • @Andreas。是的,我知道这些功能的存在。但是,我要问一些更具体的问题,请参阅问题。
  • @Dave,我不确定最小值/最大值是多少。我需要一个最小值和一个最大值。如,2个不同的值。我认为这个问题很清楚。
  • @sarsnake:这是一个假设函数,它同时返回最小值 最大值。但无论如何,为什么_min_max 不够好?

标签: javascript arrays underscore.js


【解决方案1】:

对于这样的事情,你真的不需要下划线。

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

【讨论】:

  • 如果你想在旧版浏览器中兼容,你确实需要下划线。
  • 嗯,哪个旧浏览器?
  • 请注意,对于空数组,max 返回 -Infinity。
【解决方案2】:

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

var maxValObject = _.maxBy(myArrofObjects, function(o) { return o.prop2; });

或者使用迭代的简写如下

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

_.minBy 也是如此;

参考:https://lodash.com/docs/4.17.4#maxBy

【讨论】:

    【解决方案3】:

    使用 _.max 和 _.property:

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

    【讨论】:

      【解决方案4】:

      如下使用_​​.max:

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

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

      【讨论】:

      • 可能很明显,但请注意您需要执行max_object.prop2 才能获得最大值(因为这会返回整个对象)。
      【解决方案5】:

      下划线

      使用 _.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
      • 我不能完全同意这个解决方案。您正在做一个可能很昂贵的排序,只是为了找到最小值和最大值。
      • 是的,这个想法是为将来的其他操作提供一个排序数组。我不知道 OP 的用例,但我会这样做
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 2019-09-19
      • 1970-01-01
      • 2012-02-10
      • 2023-02-16
      相关资源
      最近更新 更多