tag:forum.selfhtml.org,2005:/self Key-Value-Pair mit höchster Value ernten – SELFHTML-Forum 2019-01-06T19:49:39Z https://forum.selfhtml.org/self/2019/jan/6/key-value-pair-mit-hoechster-value-ernten/1740101#m1740101 Holger 2019-01-06T17:46:02Z 2019-01-06T17:46:02Z Key-Value-Pair mit höchster Value ernten <p>Hallo,</p> <p>ich versuche gerade aus einem Objekt das Key-Value-Pair mit der höchsten Value zu ernten und versteh nicht ganz warum ich scheitere...</p> <pre><code class="block language-javascript"><span class="token keyword">var</span> Werte <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token literal-property property">Wert1</span><span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token literal-property property">Wert2</span><span class="token operator">:</span> <span class="token number">2</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">var</span> hoechster_Wert <span class="token operator">=</span> Object<span class="token punctuation">.</span><span class="token function">keys</span><span class="token punctuation">(</span>Werte<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">reduce</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">a<span class="token punctuation">,</span> b</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>a<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// noch kein a vorhanden? aktueller Wert als Ausgangspunkt</span> a<span class="token punctuation">[</span>b<span class="token punctuation">]</span> <span class="token operator">=</span> Werte<span class="token punctuation">[</span>b<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>Werte<span class="token punctuation">[</span>b<span class="token punctuation">]</span> <span class="token operator">></span> Werte<span class="token punctuation">[</span>a<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> a<span class="token punctuation">[</span>b<span class="token punctuation">]</span> <span class="token operator">=</span> Werte<span class="token punctuation">[</span>b<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// höchster Wert überschreibt a[b]</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> a<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">/* +++ GEWÜNSCHTER OUTPUT: hoechster_Wert = {Wert2: 2} +++ */</span> </code></pre> <p>Leider wird mir nur ein leeres Objekt ausgespuckt... warum?</p> <p>Danke!</p> https://forum.selfhtml.org/self/2019/jan/6/key-value-pair-mit-hoechster-value-ernten/1740102#m1740102 pl 2019-01-06T18:11:51Z 2019-01-06T18:13:13Z Key-Value-Pair mit höchster Value ernten <p>Hallo,</p> <blockquote> <p>ich versuche gerade aus einem Objekt das Key-Value-Pair mit der höchsten Value</p> </blockquote> <p>das Vergleichs Kriterium wäre zu definieren: Kopf oder Zahl!?</p> <blockquote> <p>zu ernten und versteh nicht ganz warum ich scheitere...</p> </blockquote> <p>Am Vergleich vielleicht? Auf jeden Fall wäre Zahl mit Zahl zu vergleichen: Von Objekt zu Objekt. Und zwar über ein (temporäres) Array mit den Vergleichskriterien.</p> <p>Mfg</p> https://forum.selfhtml.org/self/2019/jan/6/key-value-pair-mit-hoechster-value-ernten/1740103#m1740103 Orlok 2019-01-06T19:02:02Z 2019-01-06T20:18:43Z Key-Value-Pair mit höchster Value ernten <p>Hallo Holger</p> <blockquote> <p>ich versuche gerade aus einem Objekt das Key-Value-Pair mit der höchsten Value zu ernten und versteh nicht ganz warum ich scheitere...</p> <pre><code class="block language-javascript"><span class="token keyword">var</span> Werte <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token literal-property property">Wert1</span><span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token literal-property property">Wert2</span><span class="token operator">:</span> <span class="token number">2</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">var</span> hoechster_Wert <span class="token operator">=</span> Object<span class="token punctuation">.</span><span class="token function">keys</span><span class="token punctuation">(</span>Werte<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">reduce</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">a<span class="token punctuation">,</span> b</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>a<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// noch kein a vorhanden? aktueller Wert als Ausgangspunkt</span> a<span class="token punctuation">[</span>b<span class="token punctuation">]</span> <span class="token operator">=</span> Werte<span class="token punctuation">[</span>b<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>Werte<span class="token punctuation">[</span>b<span class="token punctuation">]</span> <span class="token operator">></span> Werte<span class="token punctuation">[</span>a<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> a<span class="token punctuation">[</span>b<span class="token punctuation">]</span> <span class="token operator">=</span> Werte<span class="token punctuation">[</span>b<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// höchster Wert überschreibt a[b]</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> a<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Leider wird mir nur ein leeres Objekt ausgespuckt... warum?</p> </blockquote> <p>Du übergibst als Initialwert für den Akkumulator ein leeres Objekt an die Methode <code>reduce</code> und ein Objekt evaluiert in einem booleschen Kontext immer zu <code>true</code>. Das bedeutet, die erste Anweisung wird nie ausgeführt, weil die Bedingung nie erfüllt wird.</p> <p>Bei der zweiten bedingten Anweisung setzt du <code>a</code>, das immernoch ein Objekt ist, als Schlüssel für dein Objekt <code>Werte</code> ein. Schlüssel für Objekte müssen aber entweder vom Datentyp String oder vom Datentyp Symbol sein.</p> <p>Die Konsequenz deiner Handlung ist, dass die Methode <code>toString</code> des Objekts aufgerufen und deren Rückgabewert, der String <code>[object Object]</code>, als Eigenschaftsname verwendet wird. Eine Eigenschaft mit diesem Namen existiert in dem Objekt <code>Werte</code> aber nicht. Also wird beim Zugriff der Wert <code>undefined</code> zurückgegeben.</p> <p>Für <code>undefined</code> ist keine Ordnung definiert, weshalb eine Prüfung mit ‚größer als‘ oder ‚kleiner als‘ immer <code>false</code> ergibt. Die zweite Anweisung wird also auch nicht ausgeführt und infolgedessen bei jedem Aufruf das als Initialwert übergebene Objekt zurückgegeben.</p> <p>Das ist dann auch der Rückgabewert der Methode <code>reduce</code>.</p> <p>Versuchs mal so:</p> <pre><code class="block language-javascript"><span class="token keyword">const</span> object <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token literal-property property">a</span><span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token literal-property property">b</span><span class="token operator">:</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token literal-property property">c</span><span class="token operator">:</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token literal-property property">d</span><span class="token operator">:</span> <span class="token number">3</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">const</span> key <span class="token operator">=</span> Object<span class="token punctuation">.</span><span class="token function">keys</span><span class="token punctuation">(</span>object<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">reduce</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">a<span class="token punctuation">,</span> b</span><span class="token punctuation">)</span> <span class="token operator">=></span> object<span class="token punctuation">[</span>a<span class="token punctuation">]</span> <span class="token operator">></span> object<span class="token punctuation">[</span>b<span class="token punctuation">]</span> <span class="token operator">?</span> a <span class="token operator">:</span> b<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> record <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">[</span>key<span class="token punctuation">]</span><span class="token operator">:</span> object<span class="token punctuation">[</span>key<span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> record<span class="token punctuation">;</span> <span class="token comment">// {b: 5}</span> </code></pre> <p>Oder mit der Methode <code>sort</code>:</p> <pre><code class="block language-javascript"><span class="token keyword">const</span> <span class="token punctuation">[</span>key<span class="token punctuation">]</span> <span class="token operator">=</span> Object<span class="token punctuation">.</span><span class="token function">keys</span><span class="token punctuation">(</span>object<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">sort</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">a<span class="token punctuation">,</span> b</span><span class="token punctuation">)</span> <span class="token operator">=></span> object<span class="token punctuation">[</span>b<span class="token punctuation">]</span> <span class="token operator">-</span> object<span class="token punctuation">[</span>a<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Viele Grüße,</p> <p>Orlok</p> https://forum.selfhtml.org/self/2019/jan/6/key-value-pair-mit-hoechster-value-ernten/1740104#m1740104 dedlfix 2019-01-06T19:24:26Z 2019-01-06T19:24:26Z Key-Value-Pair mit höchster Value ernten <p>Tach!</p> <blockquote> <p>Leider wird mir nur ein leeres Objekt ausgespuckt... warum?</p> </blockquote> <p>Mit Debugging könnte man der Ursache näher kommen. Der Block vom ersten if-Statement wird nicht ausgeführt. Objekte sind nie falsy, auch dann nicht wenn sie keine Eigenschaften haben.</p> <p>Ich würde das nicht auf diese Weise lösen und aus der Funktion heraus auf Werte im äußere Scope zugreifen, solange das nicht unbedingt nötig ist. Und das ist es in dem Fall auch nicht.</p> <pre><code class="block language-js">Object<span class="token punctuation">.</span><span class="token function">entries</span><span class="token punctuation">(</span>Werte<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">reduce</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">a<span class="token punctuation">,</span> b</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> a<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">></span> b<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">?</span> a <span class="token operator">:</span> b<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Das Ergebnis ist allerdings kein Objekt sondern ein Array mit Key und Value der gesuchten Eigenschaft als Elemente. Und man muss hier auch nicht auf das initiale Objekt (oder in meinem Code ein Array) testen. Zugriffe auf nicht vohandene Elemente ergeben <code>undefined</code>, und das ist weder größer noch kleiner oder gleich dem Wert von b, so dass beim ersten Durchlauf das b zurückgeliefert wird.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2019/jan/6/key-value-pair-mit-hoechster-value-ernten/1740106#m1740106 Holger 2019-01-06T19:49:39Z 2019-01-06T19:49:39Z Key-Value-Pair mit höchster Value ernten <p>Hallo,</p> <p>danke für die sehr ausführliche Darstellung!</p> <p>Ich muss zu meiner Schande gestehen, dass ich beinahe schon mal so weit war (meine Definition von 'key' hat ursprünglich recht ähnlich ausgesehen) ...und ich dann am Zusammensetzen des Objekts gescheitert bin.</p> <p>Sah dann bei mir ungefähr so aus (münzt man's jetzt auf dein Beispiel um):</p> <pre><code class="block language-javascript"> <span class="token keyword">const</span> record <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token literal-property property">key</span><span class="token operator">:</span> object<span class="token punctuation">[</span>key<span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token comment">/* retourniert natürlich 'key' als Objektschlüssel - aus unerfindlichen Gründen scheitere ich nun schon zum wiederholten Mal daran, mit [key] eine Variable als Schlüssel aufzurufen… */</span> </code></pre> <p>Von da an wurde es, wie von dir penibel aufgearbeitet, immer abenteuerlicher.</p> <p>Finde ich übrigens die eleganteste Methode um seiner Objektpärchen Herr zu werden. Bin auf StackOverflow auf einen anderen Zugang gestoßen, der dagegen ein wenig unbeholfen wirkt </p> <p><a href="https://stackoverflow.com/questions/26746978/how-to-get-the-highest-key-and-value-from-object" rel="noopener noreferrer">StackOverflow - How to get the highest key and value from object</a></p> <p>Danke für deine Hilfe!</p>