Вернуть объект с наибольшим значением из нескольких массивов объектов - PullRequest
1 голос
/ 23 апреля 2020

У меня есть массив с несколькими массивами объектов, и я пытаюсь найти объект с наибольшим значением.

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}, как если бы он только просматривал первый массив?

Ответы [ 4 ]

2 голосов
/ 23 апреля 2020

Вы можете выровнять массивы и взять фильтр с помощью 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);
0 голосов
/ 23 апреля 2020

Просто и достаточно быстро:

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));
0 голосов
/ 23 апреля 2020

Когда любой из аргументов Math.max не является числом, результат будет NaN.

У вас есть массив массивов, поэтому при отображении вы получаете массивы в качестве аргумента Math.max поэтому вам нужно отфильтровать данные и затем передать их на максимум.

Примерно так должно работать

values.flat().filter(item => !isNaN(Number(item._)))

Затем вы можете передать это на max и будет работать.

0 голосов
/ 23 апреля 2020

Вы можете сделать это с помощью 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...