从多个对象数组中返回具有最高值的对象
Posted
技术标签:
【中文标题】从多个对象数组中返回具有最高值的对象【英文标题】:Return object with highest value from multiple arrays of objects 【发布时间】:2020-08-06 23:09:06 【问题描述】:我有一个包含多个对象数组的数组,我试图找到具有最高值的对象。
values = [
[ _: "NAN", id: 1,
_: "NAN", id: 2,
_: "NAN", id: 3
],
[_: "3.006", id: 4,
_: "7.206", id: 5,
_: "1.906", id: 6
],
[_: "3.226", id: 7,
_: "2.222", id: 8
_: "2.224", id: 9
],
[_: "0.006", id: 10,
_: "0.321", id: 11,
_: "0.938", id: 12
]]
我尝试使用 .map 和 .find
var a = Math.max(...values.map(e => e._))
const highestPoint = values.find(values => values._ === a)
但它只带回 NAN 作为最高点const highestPoint = _: "NAN", id: 1
,就像它只看第一个数组一样?
【问题讨论】:
【参考方案1】:您可以将数组展平并使用isFinite
进行过滤并减少数组。
var values = [[ _: "NAN", id: 1 , _: "NAN", id: 2 , _: "NAN", id: 3 ], [ _: "3.006", id: 4 , _: "7.206", id: 5 , _: "1.906", id: 6 ], [ _: "3.226", id: 7 , _: "2.222", id: 8 , _: "2.224", id: 9 ], [ _: "0.006", id: 10 , _: "0.321", id: 11 , _: "0.938", id: 12 ]],
highest = values
.flat()
.filter(( _ ) => isFinite(_))
.reduce((a, b) => +a._ > +b._ ? a : b);
console.log(highest);
【讨论】:
当然,Array.flat()
就足够了。我正在使用Array.flatMap()
!
我认为当数组中有 +Infinity 时,使用 isFinite 会排除正确的最大值。【参考方案2】:
您可以使用Array.flatMap()
和Array.map()
将所有对象放入一个数组中,Array.filter()
删除带有“NAN”的对象,然后Array.reduce
找到最大的数字:
let vals=[[_:"NAN",id:1,_:"NAN",id:2,_:"NAN",id:3],[_:"3.006",id:4,_:"7.206",id:5,_:"1.906",id:6],[_:"3.226",id:7,_:"2.222",id:8,_:"2.224",id:9],[_:"0.006",id:10,_:"0.321",id:11,_:"0.938",id:12]];
let res = vals.flatMap(arr =>
return arr.map(obj => obj)
).filter(obj => obj._ != "NAN").reduce((prv,cur) => prv._ > cur._ ? prv : cur)
console.log(res)
【讨论】:
【参考方案3】:当Math.max
的任何参数不是数字时,结果将为NaN
。
您有一个数组数组,因此在映射时您将数组作为Math.max
的参数,因此您需要过滤数据,然后将其传递给 max。
这样的东西应该可以工作
values.flat().filter(item => !isNaN(Number(item._)))
然后你可以将它传递给max
并且可以工作。
【讨论】:
【参考方案4】:足够简单和快速:
const max = (arr = []) =>
return arr.reduce(
(m, i) =>
i.forEach((x) =>
if (x._ !== 'NAN' && m._ < x._)
m = x;
);
return m;
,
_: -Infinity
);
;
const max = (arr = []) =>
return arr.reduce(
(m, i) =>
i.forEach((x) =>
if (x._ !== 'NAN' && m._ < x._)
m = x;
);
return m;
,
_: -Infinity
);
;
const data = [
[
_: "NAN", id: 1 ,
_: "NAN", id: 2 ,
_: "NAN", id: 3 ,
],
[
_: "3.006", id: 4 ,
_: "7.206", id: 5 ,
_: "1.906", id: 6 ,
],
[
_: "3.226", id: 7 ,
_: "2.222", id: 8 ,
_: "2.224", id: 9 ,
],
[
_: "0.006", id: 10 ,
_: "0.321", id: 11 ,
_: "0.938", id: 12 ,
],
];
console.log(max(data));
【讨论】:
以上是关于从多个对象数组中返回具有最高值的对象的主要内容,如果未能解决你的问题,请参考以下文章
如何从具有可链接性的 jQuery 插件的方法返回对象数组?