Ich habe so etwas:
$scope.traveler = [
{ description: 'Senior', Amount: 50},
{ description: 'Senior', Amount: 50},
{ description: 'Adult', Amount: 75},
{ description: 'Child', Amount: 35},
{ description: 'Infant', Amount: 25 },
];
Um nun einen Gesamtbetrag dieses Arrays zu haben, mache ich ungefähr so:
$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 einfach, wenn es nur ein Array gibt, aber ich habe andere Arrays mit einem anderen Eigenschaftsnamen, den ich zusammenfassen möchte.
Ich wäre glücklicher, wenn ich so etwas tun könnte:
$scope.traveler.Sum({ Amount });
Aber ich weiß nicht, wie ich das so durchgehen soll, dass ich es in Zukunft so wiederverwenden könnte:
$scope.someArray.Sum({ someProperty });
Antworten
Ich habe mich für den @ gruff-bunny-Vorschlag entschieden, um das Prototyping eines nativen Objekts (Array) zu vermeiden.
Ich habe nur eine kleine Änderung an seiner Antwort vorgenommen, um das Array zu validieren, und der zu summierende Wert ist nicht null. Dies ist meine endgültige Implementierung:
$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);
};
javascript
arrays
prototype-programming
nramirez
quelle
quelle
Antworten:
Aktualisierte Antwort
Aufgrund aller Nachteile des Hinzufügens einer Funktion zum Array-Prototyp aktualisiere ich diese Antwort, um eine Alternative bereitzustellen, bei der die Syntax der ursprünglich in der Frage angeforderten Syntax ähnelt.
Ursprüngliche Antwort
Da es sich um ein Array handelt, können Sie dem Array-Prototyp eine Funktion hinzufügen.
Die Geige: http://jsfiddle.net/9BAmj/
quelle
Array.prototype
da dies Ihren Code in Zukunft beschädigen könnte. Warum ist das Erweitern nativer Objekte eine schlechte Praxis? .Ich weiß, dass diese Frage eine akzeptierte Antwort hat, aber ich dachte, ich würde eine Alternative einschlagen , die array.reduce verwendet , da das Summieren eines Arrays das kanonische Beispiel für Reduzieren ist:
Fiddle
quelle
$scope.travelerTotal = $scope.sum($scope.traveler, 'Amount');
am Anfang der Controller-Funktion zu setzen?quelle
return Number(item.Amount);
nur um die Nummer zu überprüfenprev
in der Reduktionsfunktion streiten . Für mich bedeutet dies, dass Sie den vorherigen Wert im Array erhalten. Aber es ist wirklich die Reduzierung aller vorherigen Werte. Ich magaccumulator
,aggregator
odersumSoFar
für Klarheit.Ich vermeide es immer, die Prototypmethode zu ändern und eine Bibliothek hinzuzufügen, daher ist dies meine Lösung:
Die Verwendung der Reduce Array-Prototypmethode ist ausreichend
quelle
a
) macht den Trick bei der Verwendungreduce
mit Objekten: In der ersten Iteratoriona
wird nicht das erste Objekt desitems
Arrays sein, sondern es wird sein0
.const sumBy = (items, prop) => items.reduce((a, b) => +a + +b[prop], 0);
Verwendung:sumBy(traveler, 'Amount') // => 235
reduce
mir die Syntax völlig stumpf. Mein Gehirn versteht das immer noch "nativ" besser:let total = 0; items.forEach((item) => { total += item.price; });
let total = 0; items.forEach(item => total += item.price)
Ich dachte, ich würde meine zwei Cent dafür verlieren: Dies ist eine dieser Operationen, die immer rein funktional sein sollten und sich nicht auf externe Variablen stützen sollten. Einige gaben bereits eine gute Antwort, mit
reduce
ist der Weg hierher zu gehen.Da sich die meisten von uns die Verwendung der ES2015-Syntax bereits leisten können, ist hier mein Vorschlag:
Wir machen es zu einer unveränderlichen Funktion, während wir dabei sind. Was
reduce
hier getan wird, ist einfach Folgendes: Beginnen Sie mit einem Wert von0
für den Akkumulator und addieren Sie den Wert des aktuell geloopten Elements.Yay für funktionale Programmierung und ES2015! :) :)
quelle
Alternative für verbesserte Lesbarkeit und Verwendung
Map
undReduce
:Wiederverwendbare Funktion:
quelle
.reduce(*** => *** + ***, 0);
anderen fehlte "+1"Sie können Folgendes tun:
quelle
Es funktioniert für mich in
TypeScript
undJavaScript
:Ich hoffe es ist nützlich.
quelle
Ich bin mir nicht sicher, ob dies bereits erwähnt wurde. Dafür gibt es aber eine Lodash- Funktion. Das folgende Snippet, in dem value Ihr Attribut für die Summe ist, ist 'value'.
Beides wird funktionieren.
quelle
kann auch Array.prototype.forEach () verwenden
quelle
Hier ist ein Einzeiler mit ES6-Pfeilfunktionen.
quelle
So summieren Sie ein Objektarray mit Javascript
quelle
Aus einer Reihe von Objekten
quelle
Ich habe bereits jquery verwendet. Aber ich denke, es ist intuitiv genug, um nur zu haben:
Dies ist im Grunde nur eine Kurzversion von @ akhouris Antwort.
quelle
Hier ist eine Lösung, die ich flexibler finde:
Um die Summe zu erhalten, verwenden Sie sie einfach so:
quelle