Ich möchte die Werte eines Objekts summieren.
Ich bin an Python gewöhnt, wo es nur sein würde:
sample = { 'a': 1 , 'b': 2 , 'c':3 };
summed = sum(sample.itervalues())
Der folgende Code funktioniert, aber es ist viel Code:
function obj_values(object) {
var results = [];
for (var property in object)
results.push(object[property]);
return results;
}
function list_sum( list ){
return list.reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
});
}
function object_values_sum( obj ){
return list_sum(obj_values(obj));
}
var sample = { a: 1 , b: 2 , c:3 };
var summed = list_sum(obj_values(a));
var summed = object_values_sum(a)
Vermisse ich etwas Offensichtliches oder ist das einfach so?
javascript
object
javascript-objects
Jonathan Vanasco
quelle
quelle
Object.keys().reduce
Aussehen so viel eleganter ist, ist es 60% langsamer.So einfach kann das sein:
MDN zitieren:
von
Object.values()
auf MDNvon
Array.prototype.reduce()
auf MDNSie können diese Funktion folgendermaßen verwenden:
Beachten Sie, dass dieser Code einige ECMAScript-Funktionen verwendet, die von einigen älteren Browsern (wie dem IE) nicht unterstützt werden. Möglicherweise müssen Sie Babel verwenden , um Ihren Code zu kompilieren.
quelle
Object.values()
, die mit einer polyfilled wirdfor
Schleife auf jedem Browser neben Firefox. Auch ohne Polyfill ist esfor
für mich 4x langsamer als eine normale Schleife.Object.values()
bis zu diesem Zeitpunkt implementiert .reduce
scheint etwas narrensicherer zu sein. Haben Sie das Parsen absichtlich ausgelassen?Object.values()
von allen modernen Browsern unterstützt .Wenn Sie lodash verwenden, können Sie so etwas tun
quelle
Eine reguläre
for
Schleife ist ziemlich kurz:Möglicherweise müssen Sie hinzufügen,
object.hasOwnProperty
wenn Sie den Prototyp geändert haben.quelle
Ehrlich gesagt, würde ich angesichts unserer "modernen Zeit", wann immer möglich, einen funktionalen Programmieransatz wählen, wie zum Beispiel:
Unser Akkumulator
acc
, beginnend mit einem Wert von 0, akkumuliert alle Schleifenwerte unseres Objekts. Dies hat den zusätzlichen Vorteil, dass es nicht von internen oder externen Variablen abhängt. Es ist eine konstante Funktion, damit es nicht versehentlich überschrieben wird ... Gewinn für ES2015!quelle
Gibt es einen Grund, warum Sie nicht nur eine einfache
for...in
Schleife verwenden?http://jsfiddle.net/vZhXs/
quelle
Jetzt können Sie die
reduce
Funktion nutzen und die Summe erhalten.quelle
Ich bin etwas verspätet gegenüber der Party, aber wenn Sie eine robustere und flexiblere Lösung benötigen, dann ist hier mein Beitrag. Wenn Sie nur eine bestimmte Eigenschaft in einer Kombination aus verschachteltem Objekt und Array summieren und andere Aggregatmethoden ausführen möchten, ist hier eine kleine Funktion, die ich für ein React-Projekt verwendet habe:
Es ist rekursiv, nicht ES6, und es sollte in den meisten semi-modernen Browsern funktionieren. Sie verwenden es so:
Parameteraufschlüsselung:
obj = entweder ein Objekt oder eine Array-
Eigenschaft = die Eigenschaft innerhalb der verschachtelten Objekte / Arrays, für die Sie die Aggregatmethode für
Aggregat ausführen möchten = die Aggregatmethode (Summe, Min, Max oder Anzahl)
flach = kann entweder auf true / gesetzt werden false oder eine numerische
Werttiefe = sollte null oder undefiniert bleiben (wird verwendet, um die nachfolgenden rekursiven Rückrufe zu verfolgen).
Flach kann verwendet werden, um die Leistung zu verbessern, wenn Sie wissen, dass Sie keine tief verschachtelten Daten durchsuchen müssen. Zum Beispiel, wenn Sie das folgende Array hatten:
Wenn Sie vermeiden möchten, die Eigenschaft otherData zu durchlaufen, da der Wert, den Sie aggregieren möchten, nicht so tief verschachtelt ist, können Sie flach auf true setzen.
quelle
Verwenden Sie Lodash
quelle
quelle
Ich bin auf diese Lösung von @jbabey gestoßen, als ich versucht habe, ein ähnliches Problem zu lösen. Mit einer kleinen Modifikation habe ich es richtig gemacht. In meinem Fall sind die Objektschlüssel Zahlen (489) und Zeichenfolgen ("489"). Um dies zu lösen, wird jeder Schlüssel analysiert. Der folgende Code funktioniert:
quelle
Ein Ramda One Liner:
Verwenden:
const summed = sumValues({ 'a': 1 , 'b': 2 , 'c':3 });
quelle
Wir können Objekte mit dem Schlüsselwort in iterieren und jede arithmetische Operation ausführen.
quelle