Saya agak terlambat ke pesta, namun, jika Anda memerlukan solusi yang lebih kuat dan fleksibel, inilah kontribusi saya. Jika Anda hanya ingin menjumlahkan properti tertentu dalam kombo objek / array bersarang, serta melakukan metode agregat lainnya, maka berikut adalah fungsi kecil yang telah saya gunakan pada proyek React:
var aggregateProperty = function(obj, property, aggregate, shallow, depth) {
if ((typeof obj !== 'object' && typeof obj !== 'array') || !property) {
return;
}
obj = JSON.parse(JSON.stringify(obj));
const validAggregates = [ 'sum', 'min', 'max', 'count' ];
aggregate = (validAggregates.indexOf(aggregate.toLowerCase()) !== -1 ? aggregate.toLowerCase() : 'sum');
if (shallow === true) {
shallow = 2;
} else if (isNaN(shallow) || shallow < 2) {
shallow = false;
}
if (isNaN(depth)) {
depth = 1;
}
var value = ((aggregate == 'min' || aggregate == 'max') ? null : 0);
for (var prop in obj) {
if (!obj.hasOwnProperty(prop)) {
continue;
}
var propValue = obj[prop];
var nested = (typeof propValue === 'object' || typeof propValue === 'array');
if (nested) {
if (prop == property && aggregate == 'count') {
value++;
}
if (shallow === false || depth < shallow) {
propValue = aggregateProperty(propValue, property, aggregate, shallow, depth+1);
} else {
continue;
}
}
if ((prop == property || nested) && propValue) {
switch(aggregate) {
case 'sum':
if (!isNaN(propValue)) {
value += propValue;
}
break;
case 'min':
if ((propValue < value) || !value) {
value = propValue;
}
break;
case 'max':
if ((propValue > value) || !value) {
value = propValue;
}
break;
case 'count':
if (propValue) {
if (nested) {
value += propValue;
} else {
value++;
}
}
break;
}
}
}
return value;
}
Ini rekursif, non ES6, dan seharusnya berfungsi di sebagian besar browser semi-modern. Anda menggunakannya seperti ini:
const onlineCount = aggregateProperty(this.props.contacts, 'online', 'count');
Rincian parameter:
obj = salah satu objek atau
properti array = properti dalam objek / array bertingkat yang ingin Anda lakukan metode
agregat pada agregat = metode agregat (jumlah, min, maks, atau jumlah)
shallow = dapat disetel ke true / false atau nilai numerik
depth = harus dibiarkan nol atau tidak ditentukan (digunakan untuk melacak callback rekursif berikutnya)
Shallow dapat digunakan untuk meningkatkan kinerja jika Anda tahu bahwa Anda tidak perlu mencari data yang sangat bertingkat. Misalnya jika Anda memiliki array berikut:
[
{
id: 1,
otherData: { ... },
valueToBeTotaled: ?
},
{
id: 2,
otherData: { ... },
valueToBeTotaled: ?
},
{
id: 3,
otherData: { ... },
valueToBeTotaled: ?
},
...
]
Jika Anda ingin menghindari perulangan melalui properti otherData karena nilai yang akan Anda gabungkan tidak bertumpuk sedalam itu, Anda dapat menyetel dangkal ke true.