从多个对象数组中返回具有最高值的对象

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 插件的方法返回对象数组?

从4级json对象的数组中返回特定的json项

使用 Set 从数组中删除重复项,保持最高 id

具有对象元素的嵌套数组模式返回具有空对象的数组

在 C# 中,如何为具有多个嵌套数组的 JSON 对象建模?

Javascript:从包含对象的多维数组中返回不匹配的值