Получение ключа с наибольшим значением от объекта

88

У меня есть такой объект:

Object {a: 1, b: 2, undefined: 1} 

Как мне быстро извлечь из него идентификатор с наибольшим значением (здесь b:)? Я попытался преобразовать его в массив, а затем отсортировать, но это не сработало, так как он был отсортирован по алфавиту (и кажется излишним жонглировать данными взад и вперед только для получения одного значения из трех).

Томек Бушевски
источник
хотите получить 2или bкак результат
Наим Шейх
2
Я хочу получить b;-)
Томек Бушевски
см. :: stackoverflow.com/questions/11142884/… .. бонусный ответ :: в этом ответе вы также получаете минимальное значение вместе с максимальным .. :)
Судхир Бастакоти

Ответы:

143

Например:

var obj = {a: 1, b: 2, undefined: 1};

Object.keys(obj).reduce(function(a, b){ return obj[a] > obj[b] ? a : b });

В ES6 :

var obj = {a: 1, b: 2, undefined: 1};

Object.keys(obj).reduce((a, b) => obj[a] > obj[b] ? a : b);
CD..
источник
2
Спасибо, но учтите, что может быть больше предметов, например c, d, e... x.
Томек Бушевски
9
это работает для большего количества элементов .. функция уменьшения - это итерация по всему массиву;)
Фарис Засина
Извините за то , что беспокоит, но как я могу также получить к 2тому же b?
Томек Бушевски
@CD .. если я использую это в данном случае "var obj = {a: 1, b: 2, c: 2};" он возвращает только c, но мне нужны b & c, означает все ключи с наивысшими значениями
Динеш
3
@Dinesh, попробуй:var obj = {a: 1, b: 2, c: 2}, keys = Object.keys(obj), largest = Math.max.apply(null, keys.map(x => obj[x])) result = keys.reduce((result, key) => { if (obj[key] === largest){ result.push(key); } return result; }, []);
CD ..
35

Использование Underscore или Lo-Dash:

var maxKey = _.max(Object.keys(obj), function (o) { return obj[o]; });

С функциями стрелок ES6:

var maxKey = _.max(Object.keys(obj), o => obj[o]);

демонстрация jsFiddle

Фарис Засина
источник
15
Начиная с Lo-Dash 4.0.0 это должно быть var maxKey = _.maxBy(_.keys(obj), function (o) { return obj[o]; });.
thodic
9

Вот предложение на случай, если у вас много одинаковых значений, а не только один максимум:

    const getMax = object => {
        return Object.keys(object).filter(x => {
             return object[x] == Math.max.apply(null, 
             Object.values(object));
       });
    };

Это возвращает массив с ключами для всех из них с максимальным значением, на случай, если некоторые из них имеют равные значения. Например: если

const obj = {яблоки: 1, бананы: 1, груши: 1}
// Это вернет ['яблоки', 'бананы', 'груши']

Если же есть максимум:

const obj = {яблоки: 1, бананы: 2, груши: 1}; // Это вернет ['bananas']
---> Чтобы получить строку из массива: ['bananas'] [0] // вернет 'bananas'`

поликон
источник
Привет, а где именно поместить объект var? Когда я использую console.log, я получаю «function getMax ()»
Джефф
1
objectэто аргумент, который принимает функция выше, это синтаксис ES6 для определения функций, эквивалентный:, function getMax(object)это отвечает на ваш вопрос?
polyccon
6

Предположим, у вас есть Objectтакое:

var obj = {a: 1, b: 2, undefined: 1}

Ты можешь это сделать

var max = Math.max.apply(null,Object.keys(obj).map(function(x){ return obj[x] }));
console.log(Object.keys(obj).filter(function(x){ return obj[x] == max; })[0]);
Амит Джоки
источник
4

Очень простой метод. может быть медленным для обработки

var v = {a: 1, b: 2, undefined: 1};

function geth(o){
    var vals = [];    
    for(var i in o){
       vals.push(o[i]);
    }

    var max = Math.max.apply(null, vals);

     for(var i in o){
        if(o[i] == max){
            return i;
        }
    }
}

console.log(geth(v));
Astroanu
источник
0

const data = {
  abc: '',
  myShortKey: '',
  myVeryLongKey: ''
}


const longestKeyLength = Math.max(...Object.keys(data).map((d) => d.length));

console.log(longestKeyLength);

console.log(Object.entries(data).map(([key, val]) => `${key}: ${key.length}`));

Чарли Бодкин
источник