我知道我可以通过执行来获得具有最低属性的对象
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
答案 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;
});