Key-Value-Pair mit höchster Value ernten
bearbeitet von
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...
>
> ~~~JavaScript
> 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 wird 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:
~~~JavaScript
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`:
~~~JavaScript
const [key] = Object.keys(object).sort((a, b) => object[b] - object[a]);
~~~
Viele Grüße,
Orlok
Key-Value-Pair mit höchster Value ernten
bearbeitet von
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...
>
> ~~~JavaScript
> 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 wird 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:
~~~JavaScript
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
Key-Value-Pair mit höchster Value ernten
bearbeitet von
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...
>
> ~~~JavaScript
> 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 wird 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:
~~~JavaScript
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[a] < object[b]);
~~~
Viele Grüße,
Orlok
Key-Value-Pair mit höchster Value ernten
bearbeitet von
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...
>
> ~~~JavaScript
> 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 wird 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:
~~~JavaScript
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}
~~~
Viele Grüße,
Orlok
Key-Value-Pair mit höchster Value ernten
bearbeitet von
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...
>
> ~~~JavaScript
> 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 wird 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:
~~~JavaScript
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}
~~~
Viele Grüße,
Orlok