szQocks
@szQocks

Как найти ключ объекта с максимальным значением в массиве?

Массив => const arr = [{a:5},{b:3},{c:1},{d:6}]

Есть что-то лучше этого ? Короче , блистательнее...
И нормально ли такое решение?
const arr = [{a:5},{b:3},{c:1},{d:6}]
const sortArr = arr.sort((a,b) => Object.values(b) - Object.values(a))
const maxKey = Object.keys(sortArr[0]).join('')
console.log(maxKey)
  • Вопрос задан
  • 1113 просмотров
Решения вопроса 6
@BigSmoke
Ну можно так. Не знаю насколько это блистательнее и точно не короче, но зато за один проход и без не нужной сортировки массива.

const arr = [{a:5},{d:6},{g:0},{b:3},{c:1}];
let max = null;
let result;

for (const currentObj of arr) {
  const currentValue = currentObj[Object.keys(currentObj)[0]];
  const currentKey = Object.keys(currentObj)[0];

  if (max < currentObj[currentKey] || max === null) {
    max = currentValue;
    result = currentKey;
  }
}
console.log(result);
Ответ написан
Stalker_RED
@Stalker_RED
Можно эффективнее, без сортировки, в один проход reduce.

Можно и короче записать
только прочитать сложно будет
const maxKey = arr.reduce((a,c,v)=>(v=Object.values(c)[0],v<a.v?a:{k:Object.keys(c)[0],v:v}),{k:0,v:-Infinity}).k;

Если допустить, что значения больше нуля, и возвращать не только ключ, а весь максимальный объект, то еще короче:
const maxElem = arr.reduce((a,c,v)=>(v=Object.values(c),v<a.v?a:{k:c,v:v}),{k:0,v:0}).k;

Ответ написан
scottparker
@scottparker
хз на сколько это адекватнее) ну можно хранить отдельно ключ и значение
let max = arr[0]
arr.slice(1).forEach(function(elem) {if(Object.values(max)[0]<Object.values(elem)[0]) {max = elem}});
Ответ написан
@Absolute138
Немного моей дичи:
const arr = [{a:5},{b:3},{c:1},{d:6}];

let vals = arr.map(v=>Object.values(v)[0]);
let key = Object.keys(arr[vals.indexOf(Math.max(...vals))])[0];

console.log(key)

ИМХО: вариант BigSmoke самый быстрый и к тому же ещё читаемый для живого человека - что немаловажно в нашем деле.
Ответ написан
Комментировать
@Rerurk
Ваш вариант тоже не плох, допишите ему
console.log(Object.keys(arr.sort(((a, b) =>Object.values(b)-Object.values(a)))[0])[0])
Ответ написан
Комментировать
E1ON
@E1ON Куратор тега JavaScript
Programming, Gamedev, VR
10

const b = [{a:5},{b:3},{c:1},{d:6}];
const maxValue = Math.max(...b.map(d => Object.values(d)[0]));
const result = Object.keys(b[b.findIndex(c => Object.values(c)[0] === maxValue)])[0]

console.log(result);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы