Ini solusi saya
filter khusus yang manis dan sederhana:
(tetapi hanya terkait dengan jumlah nilai sederhana, bukan jumlah produk, saya telah membuat sumProduct
filter dan menambahkannya sebagai edit pada posting ini).
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
Ini adalah sumProduct
filter, ini menerima sejumlah argumen. Sebagai argumen, ia menerima nama properti dari data masukan, dan dapat menangani properti bersarang (bersarang ditandai dengan titik :) property.nested
;
- Meneruskan argumen nol mengembalikan panjang data input.
- Meneruskan hanya satu argumen akan mengembalikan jumlah nilai sederhana dari properti itu.
- Meneruskan lebih banyak argumen akan menghasilkan jumlah produk dari nilai properti yang diteruskan (jumlah skalar properti).
inilah JS Fiddle dan kodenya
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;
}
}
})