Отримання ключа з найбільшим значенням від об’єкта


88

У мене є такий об’єкт:

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

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


ви хочете отримати 2або bяк результат
Naeem Shaikh

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);

2
Дякую, але зауважте, що таких предметів може бути більше c, d, e... x.
Томек Бушевський

9
це працює для більшої кількості елементів .. функція зменшення - це ітерація по всьому масиву;)
Faris Zacina

Вибачте за клопот, але як я можу отримати ще й 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

Використання підкреслення або 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, я отримую "функцію getMax ()"
Джефф

1
objectце аргумент, який приймає функція, наведена вище, - це синтаксис ES6 для визначення функцій, еквівалентний:, function getMax(object)чи відповідає це на ваше запитання?
поліккон

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));

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}`));

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.