从数组中获取具有最低属性的对象

时间:2018-06-20 12:54:42

标签: javascript arrays sorting

我知道我可以通过执行来获得具有最低属性的对象

const obj = Math.min.apply(Math, myArr.map(o => { return o.val; }));

但是我必须返回对象,而不是对象的值。如何从中返回对象?

我目前的方式是

const lowest = (arr.sort((a, b) => a.val < b.val))[0];

但也许有一种更优化的方法。

工作示例:

function Obj(val) {
  this.val = val;
}

$(document).ready(() => {
  const data = [new Obj(2), new Obj(7), new Obj(9), new Obj(1), new Obj(3)];
  const lowestNumber = Math.min.apply(Math, data.map(o => {
    return o.val;
  }));
  console.log(lowestNumber);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

不起作用:

function Obj(val) {
  this.val = val;
}

$(document).ready(() => {
  const data = [new Obj(2), new Obj(7), new Obj(9), new Obj(1), new Obj(3)];
  const obj = Math.min.apply(Math, data.map(o => {
    return o;
  }));
  console.log(obj);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

这将返回NaN

4 个答案:

答案 0 :(得分:4)

由于需要对象而不是值,因此不能使用Math.min

对于线性算法,请改用reduce

const lowest = arr.reduce( (acc, a) => a.val < acc.val ? a : acc, arr[0]);

答案 1 :(得分:1)

这可能有效:

const lowest = data.reduce((a, b) => a.val < b.val ? a : b);

reduce函数用于根据连续值之间的比较将数组“还原”为单个值。扩展说明:

const lowest = data.reduce(
    function(a, b) {
        if (a.val < b.val) {
            // keep a as next value
            return a
        } else {
            // keep b as next value
            return b
        }
    })

答案 2 :(得分:0)

如果您对某些特殊的数学/数组功能不熟悉,则可以直接由您直接实现这种简单的任务。

如果阵列很大且需要合理的性能,则排序不是一种好方法。

['token']

答案 3 :(得分:0)

这也可以做到。.我相信这种方法也有不错的表现

var arr = [
    {"ID": "test1", "val": 1},
    {"ID": "test2", "val": 2},
    {"ID": "test3", "val": 3},
    {"ID": "test4", "val": 4}
]

arr.reduce(function(p, c) {
    return p.val < c.val ? p : c;
});