Pobieranie klucza o najwyższej wartości z obiektu


88

Mam taki obiekt:

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

Jak mogę szybko wyciągnąć z niego największy identyfikator wartości (tutaj b:)? Próbowałem przekonwertować go na tablicę, a następnie posortować, ale nie wyszło, ponieważ zostało posortowane alfabetycznie (i wydaje się przesadą żonglowanie danymi w tę iz powrotem po to, aby uzyskać jedną wartość z trzech).


chcesz dostać, 2czy bw rezultacie
Naeem Shaikh

2
Chcę dostać b;-)
Tomek Buszewski

zobacz :: stackoverflow.com/questions/11142884/… .. odpowiedź bonusowa :: w tej odpowiedzi otrzymujesz również wartość minimalną wraz z wartością maksymalną .. :)
Sudhir Bastakoti

Odpowiedzi:


143

Na przykład:

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

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

W ES6 :

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

Object.keys(obj).reduce((a, b) => obj[a] > obj[b] ? a : b);

2
Dziękuję, ale pamiętaj, że może być więcej elementów, na przykład c, d, e... x.
Tomek Buszewski

9
działa to dla większej liczby elementów .. funkcja redukuj to iteracja przez całą tablicę;)
Faris Zacina

Przepraszam za to, że przeszkadza, ale jak mogę też dostać 2poza b?
Tomek Buszewski

@CD .. jeśli użyję tego w tym przypadku "var obj = {a: 1, b: 2, c: 2};" zwraca tylko c, ale potrzebuję b & c, oznacza wszystkie klucze o najwyższych wartościach
Dinesh

3
@Dinesh, spróbuj: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

Używanie podkreślenia lub Lo-Dash:

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

Z funkcjami strzałek ES6:

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

jsFiddle demo


15
Od Lo-Dash 4.0.0 tak powinno być var maxKey = _.maxBy(_.keys(obj), function (o) { return obj[o]; });.
tenodyczny

9

Oto sugestia na wypadek, gdybyś miał wiele równych wartości, a nie tylko jedną maksymalną:

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

Zwraca to tablicę z kluczami dla wszystkich z maksymalną wartością, na wypadek, gdyby niektóre miały równe wartości. Na przykład: if

const obj = {jabłka: 1, banany: 1, gruszki: 1}
// To zwróci ['jabłka', 'banany', 'gruszki']

Jeśli z drugiej strony jest maksimum:

const obj = {jabłka: 1, banany: 2, gruszki: 1}; // To zwróci ['bananas']
---> Aby pobrać ciąg z tablicy: ['bananas'] [0] // zwraca 'banany'`


Cześć, gdzie dokładnie mam umieścić obiekt var? Kiedy przeglądam console.log, otrzymuję "funkcję getMax ()"
Jeff,

1
objectjest argumentem, który przyjmuje powyższa funkcja, powyższa jest składnią ES6 do definiowania funkcji, odpowiednikiem:, function getMax(object)czy to odpowiada na twoje pytanie?
Polyccon

6

Przypuśćmy, że masz coś Objecttakiego:

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

Możesz to zrobić

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

Bardzo podstawowa metoda. może być powolny w przetwarzaniu

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.