【问题标题】:From an array of objects, how to return property `b` of the object that has the highest property `a`?从对象数组中,如何返回具有最高属性“a”的对象的属性“b”?
【发布时间】:2017-08-03 14:43:13
【问题描述】:

我需要从a属性值最高的对象中获取属性b的值。

var myArr = [
  {
    a: 1,
    b: 15
  },
  {
    a: 2,
    b: 30
  }
];

我尝试了以下方法,但它只返回 a 的最大值,而不是 b

var res = Math.max.apply(Math,myArr.map(function(o){return o.a;});
var blah = getByValue(myArr);

【问题讨论】:

标签: javascript arrays object


【解决方案1】:

使用Array#reduce,并在每次迭代中获取具有最高a 值的对象:

var myArr = [{"a":1,"b":15},{"a":2,"b":30}];

var result = myArr.reduce(function(o, o1) {
  return o.a > o1.a ? o : o1;
}).b;

console.log(result);

【讨论】:

    【解决方案2】:

    可以对副本进行排序,然后根据排序方向获得第一个或最后一个:

    var myArr = [
      {
        a: 1,
        b: 15
      },
      {
        a: 2,
        b: 30
      }
    ];
    
    var highest = myArr.slice().sort((a,b)=>a.a-b.a).pop().b
    
    console.log(highest)

    【讨论】:

    • 如果您只需要单个项目,为什么还要进行完整排序?当然,这对 2 个元素来说不是问题 :) 但仍然如此。
    【解决方案3】:

    使用减少

    您可以使用.reduce() 查找具有最大a 值的元素,然后获取其b 值,如下所示:

    var myArr = [{
        a: 1,
        b: 15
      },
      {
        a: 2,
        b: 30
      }
    ];
    
    var max = myArr.reduce(function(sum, value) {
      return (sum.a > value.a) ? sum : value;
    }, myArr[0]);
    
    console.log(max.b);

    使用排序

    比较不正统的做法是使用.sort()对数组按照属性a进行降序排序,然后得到第一个元素的b值,如下所示:

    var myArr = [{
        a: 1,
        b: 15
      },
      {
        a: 2,
        b: 30
      }
    ];
    
    var max = myArr.sort(function(value1, value2) {
      return value1.a < value2.a;
    })[0];
    
    console.log(max.b);

    【讨论】:

      【解决方案4】:

      试试这个:

      var myArr = [
          {
              a: 1,
              b: 15
          },
          {
              a: 2,
              b: 30
          }
      ];
      
      var res = myArr.map(function(o){return o.b;});
      
      myArr.sort(function (o1, o2) {
          return o1.a < o2.a;
      })
      
      console.log(myArr[0].b);
      

      【讨论】: