Es gibt eine nette Array-Methode reduce()
, um einen Wert aus dem Array zu erhalten. Beispiel:
[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
});
Was ist der beste Weg, um dasselbe mit Objekten zu erreichen? Ich würde das gerne machen:
{
a: {value:1},
b: {value:2},
c: {value:3}
}.reduce(function(previous, current, index, array){
return previous.value + current.value;
});
In Object scheint jedoch keine reduce()
Methode implementiert zu sein.
javascript
arrays
object
reduce
Pavel S.
quelle
quelle
Underscore.js
?reduce
Methode gibt. Ich würde dort nachsehen. Die Lösung scheint jedoch nicht so schwierig zu sein._
es gibt eine Reduzierung für Objekte. Sie sind sich nicht sicher, ob es versehentlich funktioniert oder ob die Objektunterstützung beabsichtigt war, aber Sie können tatsächlich ein Objekt wie im Beispiel dieser Frage übergeben, und es wird (konzeptionell)for..in
Ihre Iteratorfunktion mit den Werten aufrufen, die bei jedem Schlüssel gefunden werden.Antworten:
Was Sie in diesem Fall tatsächlich wollen, sind die
Object.values
. Hier ist eine kurze ES6- Implementierung in diesem Sinne:oder einfach:
quelle
Eine Option wäre
reduce
diekeys()
:Hiermit möchten Sie einen Anfangswert angeben, oder die erste Runde wird
'a' + 2
.Wenn Sie das Ergebnis als Object (
{ value: ... }
) möchten , müssen Sie das Objekt jedes Mal initialisieren und zurückgeben:quelle
@babel/plugin-proposal-object-rest-spread
Plugin verwendet habe, habe ich den Akkumulatorwert in verteilt Rückkehr von Reduzieren und es funktioniert wie ein Zauber, aber ich war wondere, wenn ich etwas falsch mache, weil ich das Objekt auf den Anfangswert von Reduzieren übergab und Ihre Antwort mir bewies, dass ich das Richtige getan habe!ES6-Implementierung: Object.entries ()
quelle
Object.entries(o); // returns [['value',1],['value',2],['value',3]]
function (total, pair)
zufunction (total, [key, value])
entries
ein sauberer Weg , dies zu tun vorbei istkeys
, ist es weniger performant. hackernoon.com/…Erstens bekommt man nicht ganz, was reduziert wird ist ‚s vorheriger Wert.
In deinem Pseudocode hast du
return previous.value + current.value
also denprevious
Wert beim nächsten Aufruf eine Nummer, kein Objekt.Zweitens
reduce
handelt es sich um eine Array-Methode, nicht um eine Objektmethode, und Sie können sich nicht auf die Reihenfolge verlassen, wenn Sie die Eigenschaften eines Objekts iterieren (siehe: https://developer.mozilla.org/en-US/docs/). JavaScript / Reference / Statements / for ... in , dies gilt auch für Object.keys ); Ich bin mir also nicht sicher, ob ich mich bewerben sollreduce
auf ein Objekt sinnvoll ist.Wenn die Reihenfolge jedoch nicht wichtig ist, können Sie Folgendes haben:
Oder Sie können einfach Karte den Wert des Objekts:
PS in ES6 mit der Syntax der Fat Arrow-Funktion (bereits in Firefox Nightly) könnten Sie etwas schrumpfen:
quelle
1:
2:
3:
quelle
Erweitern Sie Object.prototype.
Verwendungsbeispiel.
n'Joy it, Leute !! ;-);
quelle
Object.entries()
2021 zu verwendenSie können einen Generatorausdruck verwenden (der seit Jahren in allen Browsern und in Node unterstützt wird), um die Schlüssel-Wert-Paare in einer Liste abzurufen, die Sie reduzieren können:
quelle
Ein Objekt kann in ein Array umgewandelt werden mit: Object.entries () , Object.keys () , Object.values () und dann als Array reduziert werden. Sie können ein Objekt aber auch reduzieren, ohne das Zwischenarray zu erstellen.
Ich habe ein kleines Hilfsbibliothek-Odict für die Arbeit mit Objekten erstellt.
Es hat eine
reduce
Funktion, die sehr ähnlich wie Array.prototype.reduce () funktioniert :Sie können es auch zuweisen:
da diese Methode sehr nützlich ist!
Die Antwort auf Ihre Frage wäre also:
quelle
Wenn Sie ein Array verwenden können, verwenden Sie ein Array. Die Länge und Reihenfolge eines Arrays sind halb so hoch.
/ * zurückgegebener Wert: (Nummer) 6 * /
quelle
Dies ist nicht sehr schwer selbst umzusetzen:
In Aktion:
Sie können es auch dem Objektprototyp hinzufügen:
quelle
Da dies in einer Antwort noch nicht wirklich bestätigt wurde,
reduce
funktioniert Underscore auch dafür.Hinweis:
_.reduce
Gibt den einzigen Wert (Objekt oder anderweitig) zurück, wenn das Listenobjekt nur ein Element enthält, ohne die Iteratorfunktion aufzurufen.quelle
Probieren Sie diese Einzeiler-Pfeilfunktion aus
quelle
Probier diese. Es werden Zahlen von anderen Variablen sortiert.
quelle