Orlok: Key-Value-Pair mit höchster Value ernten

Beitrag lesen

Hallo Holger

ich versuche gerade aus einem Objekt das Key-Value-Pair mit der höchsten Value zu ernten und versteh nicht ganz warum ich scheitere...

var Werte = {Wert1: 1, Wert2: 2};


var hoechster_Wert = Object.keys(Werte).reduce(function(a, b) {
		if (!a) { // noch kein a vorhanden? aktueller Wert als Ausgangspunkt
			a[b] = Werte[b];
		}
			if (Werte[b] > Werte[a]) {
			a[b] = Werte[b]; // höchster Wert überschreibt a[b]
		}
		return a;
}, {});

Leider wird mir nur ein leeres Objekt ausgespuckt... warum?

Du übergibst als Initialwert für den Akkumulator ein leeres Objekt an die Methode reduce und ein Objekt evaluiert in einem booleschen Kontext immer zu true. Das bedeutet, die erste Anweisung wird nie ausgeführt, weil die Bedingung nie erfüllt wird.

Bei der zweiten bedingten Anweisung setzt du a, das immernoch ein Objekt ist, als Schlüssel für dein Objekt Werte ein. Schlüssel für Objekte müssen aber entweder vom Datentyp String oder vom Datentyp Symbol sein.

Die Konsequenz deiner Handlung ist, dass die Methode toString des Objekts aufgerufen und deren Rückgabewert, der String [object Object], als Eigenschaftsname verwendet wird. Eine Eigenschaft mit diesem Namen existiert in dem Objekt Werte aber nicht. Also wird beim Zugriff der Wert undefined zurückgegeben.

Für undefined ist keine Ordnung definiert, weshalb eine Prüfung mit ‚größer als‘ oder ‚kleiner als‘ immer false ergibt. Die zweite Anweisung wird also auch nicht ausgeführt und infolgedessen bei jedem Aufruf das als Initialwert übergebene Objekt zurückgegeben.

Das ist dann auch der Rückgabewert der Methode reduce.

Versuchs mal so:

const object = {
    a: 1,
    b: 5,
    c: 2,
    d: 3
};


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


const record = {
    [key]: object[key]
};


record; // {b: 5}

Oder mit der Methode sort:

const [key] = Object.keys(object).sort((a, b) => object[b] - object[a]);

Viele Grüße,

Orlok