Bessere Möglichkeit, einen Eigenschaftswert in einem Array zu summieren
Ich habe so etwas wie dieses:
$scope.traveler = [
{ description: 'Senior', Amount: 50},
{ description: 'Senior', Amount: 50},
{ description: 'Adult', Amount: 75},
{ description: 'Child', Amount: 35},
{ description: 'Infant', Amount: 25 },
];
Nun eine Summe von diesem Feld bin ich sowas:
$scope.totalAmount = function(){
var total = 0;
for (var i = 0; i < $scope.traveler.length; i++) {
total = total + $scope.traveler[i].Amount;
}
return total;
}
Es ist leicht, wenn nur ein array, aber ich habe andere arrays mit einer anderen Eigenschaft name, möchte ich eine Summe.
Ich wäre glücklicher, Wenn ich tun könnte etwas wie diese:
$scope.traveler.Sum({ Amount });
Aber ich weiß nicht, wie Sie dies in einer Weise, die ich wiederverwenden konnte, es in Zukunft so:
$scope.someArray.Sum({ someProperty });
Antwort
Entschied ich mich für @schroff-bunny Vorschlag, also ich vermeiden prototyping native Objekt (Array)
Ich habe gerade ein wenig Modifikation, um seine Antwort die Validierung der array und der Wert der Summe nicht null ist, dies ist meine Letzte Umsetzung:
$scope.sum = function (items, prop) {
if (items == null) {
return 0;
}
return items.reduce(function (a, b) {
return b[prop] == null ? a : a + b[prop];
}, 0);
};
InformationsquelleAutor der Frage nramirez | 2014-04-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da es ein array ist, könnten Sie eine Funktion hinzufügen zum Array-Prototyp.
Fiedel: http://jsfiddle.net/9BAmj/
InformationsquelleAutor der Antwort bottens
Ich weiß, dass diese Frage eine akzeptierte Antwort, aber ich dachte, ich würde chip mit einer alternative, die verwendet array.reduzierenzu sehen, dass die Summen in einem array ist das kanonische Beispiel für reduce:
Geige
InformationsquelleAutor der Antwort Gruff Bunny
InformationsquelleAutor der Antwort SoEzPz
Dachte ich, ich lasse meine zwei Cent dazu: dies ist einer jener Vorgänge, die sollte immer rein funktional, nicht unter Berufung auf irgendwelche externen Variablen. Ein paar gab schon eine gute Antwort, mit
reduce
ist der Weg hier zu gehen.Da die meisten von uns können sich schon leisten, zu verwenden ES2015 syntax, hier ist mein Vorschlag:
Machen wir es eine unveränderliche Funktion, während wir an sind es. Was
reduce
hier macht, ist einfach dieses:Beginnen Sie mit einem Wert von
0
für den Akku, und fügen Sie den Wert des aktuellen looped Element, um es.Yay für die funktionale Programmierung und ES2015! 🙂
InformationsquelleAutor der Antwort Ricardo Magalhães
Ich immer vermeiden, ändern Prototyp-Methode und der Bibliothek hinzufügen, so ist dies meine Lösung:
Verwendung reduzieren Array-Prototyp-Methode ist ausreichend
InformationsquelleAutor der Antwort Eric Marcelino
Ich bin nicht sicher, ob dies wurde noch erwähnt. Aber es ist ein lodash Funktion. Snippet unter dem Wert ist das Attribut Summe ist 'Wert'.
Beide funktionieren.
InformationsquelleAutor der Antwort Liam Middleton
können auch Array.der Prototyp.forEach()
InformationsquelleAutor der Antwort akhouri
War ich schon mit jquery. Aber ich denke, es intuitiv genug, um Sie einfach haben:
Dies ist im Grunde nur eine kurze-hand-version von @akhouri Antwort.
InformationsquelleAutor der Antwort SpiRail