C'est ma solution
filtre personnalisé doux et simple:
(mais uniquement lié à une simple somme de valeurs, pas à un produit de somme, j'ai créé un sumProduct
filtre et l' ai ajouté en tant que modification à cet article).
angular.module('myApp', [])
.filter('total', function () {
return function (input, property) {
var i = input instanceof Array ? input.length : 0;
// if property is not defined, returns length of array
// if array has zero length or if it is not an array, return zero
if (typeof property === 'undefined' || i === 0) {
return i;
// test if property is number so it can be counted
} else if (isNaN(input[0][property])) {
throw 'filter total can count only numeric values';
// finaly, do the counting and return total
} else {
var total = 0;
while (i--)
total += input[i][property];
return total;
}
};
})
EDIT: sumProduct
C'est un sumProduct
filtre, il accepte n'importe quel nombre d'arguments. En tant qu'argument, il accepte le nom de la propriété à partir des données d'entrée, et il peut gérer la propriété imbriquée (imbrication marquée par un point:) property.nested
;
- Passer l'argument zéro renvoie la longueur des données d'entrée.
- Passer un seul argument renvoie une simple somme des valeurs de ces propriétés.
- Passer plus d'arguments renvoie la somme des produits des valeurs des propriétés passées (somme scalaire des propriétés).
voici JS Fiddle et le code
angular.module('myApp', [])
.filter('sumProduct', function() {
return function (input) {
var i = input instanceof Array ? input.length : 0;
var a = arguments.length;
if (a === 1 || i === 0)
return i;
var keys = [];
while (a-- > 1) {
var key = arguments[a].split('.');
var property = getNestedPropertyByKey(input[0], key);
if (isNaN(property))
throw 'filter sumProduct can count only numeric values';
keys.push(key);
}
var total = 0;
while (i--) {
var product = 1;
for (var k = 0; k < keys.length; k++)
product *= getNestedPropertyByKey(input[i], keys[k]);
total += product;
}
return total;
function getNestedPropertyByKey(data, key) {
for (var j = 0; j < key.length; j++)
data = data[key[j]];
return data;
}
}
})