Schlüssel mit dem höchsten Wert vom Objekt abrufen


86

Ich habe ein Objekt wie dieses:

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

Wie kann ich schnell die größte Wertkennung (hier :) daraus ziehen b? Ich habe versucht, es in ein Array zu konvertieren und dann zu sortieren, aber es hat nicht funktioniert, da es alphabetisch sortiert wurde (und es scheint ein Overkill zu sein, Daten hin und her zu jonglieren, nur um einen von drei Werten zu erhalten).


willst du bekommen 2oder bals Ergebnis
Naeem Shaikh

2
Ich möchte bekommen b;-)
Tomek Buszewski

siehe :: stackoverflow.com/questions/11142884/… .. Bonusantwort :: Sie erhalten auch Min-Wert zusammen mit Max in dieser Antwort .. :)
Sudhir Bastakoti

Antworten:


141

Zum Beispiel:

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

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

In ES6 :

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

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

1
Vielen Dank, aber bitte beachten Sie, dass es weitere Artikel geben kann, wie z c, d, e... x.
Tomek Buszewski

8
Dies funktioniert für mehr Elemente. Die Reduktionsfunktion ist eine Iteration durch das gesamte Array;)
Faris Zacina

Tut mir leid, dass ich mir die Mühe gemacht habe, aber wie kann ich auch ein 2Nebenprodukt bekommen b?
Tomek Buszewski

@CD .. wenn ich dies in diesem Fall verwende "var obj = {a: 1, b: 2, c: 2};" es gibt nur c zurück, aber ich brauche b & c, bedeutet alle Schlüssel mit den höchsten Werten
Dinesh

3
@ Dinesh, versuchen Sie: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

Unterstrich oder Lo-Dash verwenden:

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

Mit ES6-Pfeilfunktionen:

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

jsFiddle-Demo


15
Ab Lo-Dash 4.0.0 sollte dies nun sein var maxKey = _.maxBy(_.keys(obj), function (o) { return obj[o]; });.
Thodic

9

Hier ist ein Vorschlag für den Fall, dass Sie viele gleiche Werte und nicht nur ein Maximum haben:

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

Dies gibt ein Array mit den Schlüsseln für alle mit dem Maximalwert zurück, falls es einige gibt, die gleiche Werte haben. Zum Beispiel: wenn

const obj = {Äpfel: 1, Bananen: 1, Birnen: 1}
// Dies gibt ['Äpfel', 'Bananen', 'Birnen'] zurück.

Wenn es andererseits ein Maximum gibt:

const obj = {Äpfel: 1, Bananen: 2, Birnen: 1}; // Dies gibt ['bananas'] zurück
---> Um den String aus dem Array zu entfernen: ['bananas'] [0] // gibt 'bananas'` zurück


Hallo, wo soll ich das Objekt var genau platzieren? Wenn ich console.log bekomme ich eine "Funktion getMax ()"
Jeff

1
objectIst das Argument, das die obige Funktion annimmt, das obige die ES6-Syntax zum Definieren von Funktionen, äquivalent zu: function getMax(object)Beantwortet das Ihre Frage?
Polyccon

6

Angenommen, Sie haben eine solche Object:

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

Du kannst das

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

Sehr einfache Methode. ist möglicherweise langsam zu verarbeiten

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.