J'ai quelque chose comme ça:
$scope.traveler = [
{ description: 'Senior', Amount: 50},
{ description: 'Senior', Amount: 50},
{ description: 'Adult', Amount: 75},
{ description: 'Child', Amount: 35},
{ description: 'Infant', Amount: 25 },
];
Maintenant, pour avoir un montant total de ce tableau, je fais quelque chose comme ceci:
$scope.totalAmount = function(){
var total = 0;
for (var i = 0; i < $scope.traveler.length; i++) {
total = total + $scope.traveler[i].Amount;
}
return total;
}
C'est facile lorsqu'il n'y a qu'un seul tableau, mais j'ai d'autres tableaux avec un nom de propriété différent que je voudrais additionner.
Je serais plus heureux si je pouvais faire quelque chose comme ça:
$scope.traveler.Sum({ Amount });
Mais je ne sais pas comment passer par là de manière à pouvoir le réutiliser à l'avenir comme ceci:
$scope.someArray.Sum({ someProperty });
Répondre
J'ai décidé d'utiliser la suggestion @ gruff-bunny, donc j'évite de prototyper un objet natif (Array)
Je viens de faire une petite modification à sa réponse en validant le tableau et la valeur à sum n'est pas nulle, c'est ma mise en œuvre finale:
$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
la source
la source
Réponses:
Réponse mise à jour
En raison de tous les inconvénients de l'ajout d'une fonction au prototype Array, je mets à jour cette réponse pour fournir une alternative qui garde la syntaxe similaire à la syntaxe initialement demandée dans la question.
Réponse originale
Puisqu'il s'agit d'un tableau, vous pouvez ajouter une fonction au prototype Array.
Le violon: http://jsfiddle.net/9BAmj/
la source
Array.prototype
car cela pourrait casser votre code à l'avenir. Pourquoi l'extension des objets natifs est-elle une mauvaise pratique? .Je sais que cette question a une réponse acceptée, mais j'ai pensé que je ferais partie d'une alternative qui utilise array.reduce , car la sommation d'un tableau est l'exemple canonique pour réduire:
Fiddle
la source
$scope.travelerTotal = $scope.sum($scope.traveler, 'Amount');
au début de la fonction de contrôleur?la source
return Number(item.Amount);
pour vérifier le numéro seulementprev
dans la fonction de réduction. Pour moi, cela implique que vous obtenez la valeur précédente dans le tableau. Mais c'est vraiment la réduction de toutes les valeurs précédentes. J'aimeaccumulator
,aggregator
ousumSoFar
pour plus de clarté.J'évite toujours de changer de méthode de prototype et d'ajouter une bibliothèque, c'est donc ma solution:
L'utilisation de la méthode de prototype de réduction de matrice est suffisante
la source
a
) fait l'affaire lors de l'utilisationreduce
avec des objets: dans la première itération,a
ne sera pas le premier objet duitems
tableau, à la place il le sera0
.const sumBy = (items, prop) => items.reduce((a, b) => +a + +b[prop], 0);
Utilisation:sumBy(traveler, 'Amount') // => 235
reduce
syntaxe me semble totalement obtuse. Mon cerveau comprend toujours mieux cela "nativement":let total = 0; items.forEach((item) => { total += item.price; });
let total = 0; items.forEach(item => total += item.price)
J'ai pensé que je laisserais tomber mes deux cents là-dessus: c'est l'une de ces opérations qui devrait toujours être purement fonctionnelle, ne reposant sur aucune variable externe. Quelques-uns ont déjà donné une bonne réponse, en utilisant
reduce
est la voie à suivre ici.Étant donné que la plupart d'entre nous peuvent déjà se permettre d'utiliser la syntaxe ES2015, voici ma proposition:
Nous en faisons une fonction immuable tant que nous y sommes. Ce qui
reduce
est fait ici est simplement ceci: Commencez par une valeur de0
pour l'accumulateur et ajoutez-y la valeur de l'élément en boucle actuel.Yay pour la programmation fonctionnelle et ES2015! :)
la source
Alternative pour une meilleure lisibilité et utilisation
Map
etReduce
:Fonction réutilisable:
la source
.reduce(*** => *** + ***, 0);
autres manquaient que "+1"Vous pouvez faire ce qui suit:
la source
Cela fonctionne pour moi
TypeScript
etJavaScript
:J'espère que c'est utile.
la source
Je ne suis pas sûr que cela ait encore été mentionné. Mais il y a une fonction lodash pour cela. Extrait ci-dessous où la valeur est votre attribut à additionner est «valeur».
Les deux fonctionneront.
la source
peut également utiliser Array.prototype.forEach ()
la source
Voici un one-liner utilisant les fonctions fléchées ES6.
la source
Comment additionner un tableau d'objets en utilisant Javascript
la source
À partir d'un tableau d'objets
la source
J'utilisais déjà jquery. Mais je pense que c'est assez intuitif pour avoir:
Ceci est essentiellement une version abrégée de la réponse de @ akhouri.
la source
Voici une solution que je trouve plus flexible:
Pour obtenir la somme, utilisez-la simplement comme ça:
la source