【问题标题】: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},就像它只看第一个数组一样?

【问题讨论】:

    标签: javascript arrays ecmascript-6 array.prototype.map


    【解决方案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));

        【讨论】:

          猜你喜欢
          • 2013-09-28
          • 2015-06-23
          • 1970-01-01
          • 2019-09-28
          • 2021-03-23
          • 1970-01-01
          • 1970-01-01
          • 2021-05-29
          • 2022-01-07
          相关资源
          最近更新 更多