Ich habe ein Array von Objekten und möchte diese Objekte auf einer bestimmten Objekteigenschaft vergleichen. Hier ist mein Array:
var myArray = [
{"ID": 1, "Cost": 200},
{"ID": 2, "Cost": 1000},
{"ID": 3, "Cost": 50},
{"ID": 4, "Cost": 500}
]
Ich möchte mich speziell auf die "Kosten" konzentrieren und einen minimalen und maximalen Wert erhalten. Mir ist klar, dass ich einfach die Kostenwerte abrufen und in ein Javascript-Array verschieben und dann das schnelle JavaScript Max / Min ausführen kann .
Gibt es jedoch eine einfachere Möglichkeit, dies zu tun, indem Sie den Array-Schritt in der Mitte umgehen und die Objekteigenschaften (in diesem Fall "Kosten") direkt verlassen?
quelle
lowest=highest=myArray[0]
und die Schleife setzen und dann um 1 beginnen.myArray[0].Cost
aber sein. Wenn jedoch kein erstes Element vorhanden ist, wird ein Fehler ausgegeben. Daher ist eine zusätzliche Überprüfung erforderlich, die möglicherweise den kleinen Leistungsschub rückgängig macht.var lowestObject; for (...)
undif (tmp < lowest) { lowestObject = myArray[i]; lowest = tmp; }
Die Reduzierung ist gut für solche Dinge: um aggregierte Operationen (wie min, max, avg usw.) für ein Array von Objekten auszuführen und ein einzelnes Ergebnis zurückzugeben:
... oder Sie können diese innere Funktion mit der ES6-Funktionssyntax definieren:
Wenn du süß sein willst, kannst du dies an ein Array anhängen:
Jetzt können Sie einfach sagen:
Bitte beachten Sie, dass wenn Sie dies verwenden möchten, nicht für jede Situation eine vollständige Überprüfung durchgeführt wird. Wenn Sie ein Array primitiver Typen übergeben, schlägt dies fehl. Wenn Sie nach einer Eigenschaft suchen, die nicht vorhanden ist, oder wenn nicht alle Objekte diese Eigenschaft enthalten, erhalten Sie das letzte Element. Diese Version ist etwas sperriger, hat aber folgende Überprüfungen:
quelle
prev.Cost
undefiniert ist? Oder wird es als 0 initiiert?Verwenden
sort
Sie diese Option , wenn Sie sich nicht für das zu ändernde Array interessieren.quelle
myArray
, was möglicherweise nicht zu erwarten ist.O(nlog(n))
O(n)
Verwenden Sie
Math
Funktionen und ziehen Sie die gewünschten Werte herausmap
.Hier ist der jsbin:
https://jsbin.com/necosu/1/edit?js,console
AKTUALISIEREN:
Wenn Sie ES6 verwenden möchten:
quelle
apply
. Sagen Sie einfach -Math.min(...myArray.map(o => o.Cost))
um das Minimum undMath.max(...myArray.map(o => o.Cost))
das Maximum zu finden.Ich denke, Rob Ws Antwort ist wirklich die richtige (+1), aber nur zum Spaß: Wenn Sie "klug" sein wollen, können Sie so etwas tun:
oder wenn Sie eine tief verschachtelte Struktur hätten, könnten Sie etwas funktionaler werden und Folgendes tun:
Diese könnten leicht in nützlichere / spezifischere Formen gebracht werden.
quelle
für max
für min
quelle
Versuchen Sie (
a
ist Array,f
ist Feld zu vergleichen)Code-Snippet anzeigen
quelle
Mit Array.prototype.reduce () können Sie Komparatorfunktionen einbinden , um das Element min, max usw. in einem Array zu bestimmen.
quelle
Dies ist eine bessere Lösung
quelle
Wenn Sie die Antwort von Tristan Reid (+ mit es6) ergänzen, können Sie eine Funktion erstellen, die einen Rückruf akzeptiert und den Operator enthält, den Sie auf das
prev
und anwenden möchtencurr
:Dann könnten Sie es einfach nennen mit:
quelle
Dies kann mit lodashs
minBy
undmaxBy
Funktionen erreicht werden.Lodashs
minBy
undmaxBy
DokumentationLösung
quelle
Verwenden von
Math.min
undMath.max
:quelle
1, native Java-Skript-Methode
2, zuerst das Objekt sortieren, dann ist es einfach, min max aus dem sortierten Objekt zu erhalten
quelle
Eine andere, ähnlich wie Kennebecs Antwort, aber alles in einer Zeile:
quelle
Sie können stattdessen das integrierte Array-Objekt verwenden, um Math.max / Math.min zu verwenden:
quelle