Ich habe ein Objekt in Javascript wie folgt:
{ "a":4, "b":0.5 , "c":0.35, "d":5 }
Gibt es eine schnelle Möglichkeit, den minimalen und maximalen Wert zwischen den Eigenschaften zu ermitteln, ohne sie alle durchlaufen zu müssen? weil das Objekt, das ich habe, riesig ist und ich alle zwei Sekunden den Min / Max-Wert erhalten muss. (Die Werte des Objekts ändern sich ständig).
javascript
jquery
Youssef
quelle
quelle
Antworten:
Es gibt im allgemeinen Fall keine Möglichkeit, das Maximum / Minimum zu finden, ohne alle n Elemente zu durchlaufen (wenn Sie von 1 nach n-1 gehen, woher wissen Sie, ob das Element n nicht größer (oder kleiner) als das ist Strom max / min)?
Sie haben erwähnt, dass sich die Werte alle paar Sekunden ändern. Wenn Sie genau wissen, welche Werte sich ändern, können Sie mit Ihren vorherigen Max / Min-Werten beginnen und nur mit den neuen vergleichen. Selbst in diesem Fall können Sie dies tun, wenn einer der geänderten Werte Ihr alter Max / Min-Wert war müssen sie erneut durchlaufen.
Eine andere Alternative - wiederum nur, wenn die Anzahl der sich ändernden Werte gering ist - besteht darin, die Werte in einer Struktur wie einem Baum oder einem Heap zu speichern. Wenn die neuen Werte eintreffen, würden Sie sie entsprechend einfügen (oder aktualisieren). Aber ob Sie das können, ist anhand Ihrer Frage nicht klar.
Wenn Sie das maximale / minimale Element einer bestimmten Liste erhalten möchten, während Sie alle Elemente durchlaufen, können Sie so etwas wie das folgende Snippet verwenden, aber Sie können dies nicht tun, ohne alle Elemente durchzugehen
quelle
Update: Moderne Version (ES6 +)
Ursprüngliche Antwort:
Versuche dies:
und dann:
Live-Demo: http://jsfiddle.net/7GCu7/1/
quelle
max = Object.keys(obj).reduce(function(m, k){ return obj[k] > m ? obj[k] : m }, -Infinity);
Math.max(...arr);
min
undmax
müssen trotzdem das Eingabearray durchlaufen - wie sonst würden sie das größte oder kleinste Element finden?Eine kurze
for..in
Schleife funktioniert also einwandfrei.quelle
O(n log n)
, die von Natur aus langsamer ist als dieO(n)
, die nur einmal durchgescannt werden würde ...Du könntest es versuchen:
quelle
quelle
Sie können es auch mit versuchen
Object.values
quelle
Mit der lodash-Bibliothek können Sie kürzer schreiben
quelle
Hier ist eine Lösung, mit der Sie auch den Schlüssel zurückgeben können und nur eine Schleife ausführen. Es sortiert die Einträge des Objekts (nach Wert) und gibt dann den ersten und den letzten zurück.
Außerdem wird das sortierte Objekt zurückgegeben, das das vorhandene Objekt ersetzen kann, sodass zukünftige Sortierungen schneller sind, da es bereits halbsortiert ist = besser als O (n). Es ist wichtig zu beachten, dass Objekte ihre Reihenfolge in ES6 beibehalten.
quelle
Für verschachtelte Strukturen unterschiedlicher Tiefe
{node: {leaf: 4}, leaf: 1}
funktioniert dies (dh mit lodash oder Unterstrich):quelle
quelle
Das funktioniert bei mir:
quelle